~~~
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
<title>珠峰培訓 - 微信:18310612838</title>
<!-- IMPORT CSS -->
<link rel="stylesheet" href="reset.min.css">
<style>
.tabBox {
margin: 20px auto;
width: 500px;
}
.tabBox .tab {
position: relative;
top: 1px;
}
.tabBox .tab li {
float: left;
margin-right: 10px;
padding: 0 10px;
height: 35px;
line-height: 35px;
font-size: 14px;
border: 1px solid #AAA;
background: #f6f7fb;
cursor: pointer;
}
.tabBox .tab li.active {
background: #FFF;
border-bottom-color: #FFF;
}
.tabBox div {
display: none;
padding: 10px;
height: 100px;
border: 1px solid #AAA;
background: #FFF;
}
.tabBox div.active {
display: block;
}
</style>
</head>
<body>
<!-- 想讓哪一個LI頁卡和DIV內容顯示選中狀態,就讓其具備active樣式類(常規樣式都是不選中的,默認給第一個LI和DIV設置active,默認只有第一個選中)-->
<section class="tabBox" id="tabBox">
<!-- 頁卡 -->
<ul class="tab clearfix">
<li class="active">編程</li>
<li>讀書</li>
<li>運動</li>
</ul>
<!-- 頁卡對應的內容(有幾個頁卡,對應幾個內容) -->
<div class="active">編程可以使我“賺取高薪”</div>
<div>讀書可以使我“修身養性”</div>
<div>運動可以使我“身體健康”</div>
</section>
<!-- IMPORT JS -->
<script>
/*
* 點擊.TAB-BOX的LI中的任意一個,都讓當前點擊的這個LI和其對應的DIV有選中的樣式(CLASS='ACTIVE'),因為只能同時選中一個,所以還需要讓除點擊這個LI以外的LI和對應的DIV移除ACTIVE選中的樣式 => 換一個思路:點擊某一個LI,我先讓所有的LI和DIV都移除選中的樣式,接著讓當前點擊的LI和DIV有選中樣式
* 1.想要操作誰,就先獲取誰
* 2.事件綁定
* 3.實現點擊LI要處理的事情
*/
/* // 獲取TAB-BOX及其后代中的三個LI和三個DIV(范圍限定在獲取TAB-BOX中的)
var tabBox = document.getElementById('tabBox'),
tabList = tabBox.getElementsByTagName('li'),
contentList = tabBox.getElementsByTagName('div');
// 分別給三個LI綁定點擊事件
tabList[0].onclick = function () {
// 先讓所有的LI和DIV移除選中樣式(循環:TAB-LIST中有多少個LI,我們就讓其循環多少次)
for (var i = 0; i < tabList.length; i++) {
// tabList[i] 當前循環中要操作的那個LI
tabList[i].className = '';
contentList[i].className = '';
}
// 再讓第一個LI和DIV有選中樣式
tabList[0].className = 'active';
contentList[0].className = 'active';
};
tabList[1].onclick = function () {
for (var i = 0; i < tabList.length; i++) {
tabList[i].className = '';
contentList[i].className = '';
}
tabList[1].className = 'active';
contentList[1].className = 'active';
};
tabList[2].onclick = function () {
for (var i = 0; i < tabList.length; i++) {
tabList[i].className = '';
contentList[i].className = '';
}
tabList[2].className = 'active';
contentList[2].className = 'active';
}; */
</script>
<script>
var tabBox = document.getElementById('tabBox'),
tabList = tabBox.getElementsByTagName('li'),
contentList = tabBox.getElementsByTagName('div');
// * 優化:利用函數封裝的機制,把點擊每一個LI要處理的事情(這些事情基本都一樣)進行封裝,以此來減少頁面中的冗余代碼
function changeTab(index) {
// 1.清空所有LI和DIV的選中樣式
for (var i = 0; i < tabList.length; i++) {
tabList[i].className = '';
contentList[i].className = '';
}
// // 2.讓點擊的這個LI和DIV有選中樣式(但是創建函數的時候,還不知道點擊的是哪一個LI呢,只有點擊的時候才知道,此時我們要把點擊的是哪一個作為形參,提供對應的入口) =>index形參變量:點擊的是誰,就在執行changeTab的時候,把點擊這一項的索引傳遞給我
tabList[index].className = 'active';
contentList[index].className = 'active';
}
// // 分別給三個LI綁定點擊事件
tabList[0].onclick = function () {
changeTab(0);
};
tabList[1].onclick = function () {
changeTab(1);
};
tabList[2].onclick = function () {
changeTab(2);
};
</script>
<script>
var tabBox = document.getElementById('tabBox'),
tabList = tabBox.getElementsByTagName('li'),
contentList = tabBox.getElementsByTagName('div');
function changeTab(index) {
for (var i = 0; i < tabList.length; i++) {
tabList[i].className = '';
contentList[i].className = '';
}
tabList[index].className = 'active';
contentList[index].className = 'active';
}
for (var i = 0; i < tabList.length; i++) {
tabList[i].zhufeng = i;
tabList[i].onclick = function () {
changeTab(this.zhufeng);
};
}
/*
* 循環綁定點擊事件(而不是一個個的綁定)
* 基于自定義屬性解決方案實現:在之前的某個階段,把一些信息當做自定義屬性賦值給元素對象,到后期,需要用到這些值的時候,我們從自定義屬性中獲取到即可
*/
/* for (var i = 0; i < tabList.length; i++) {
//=>tabList[i] 獲取到的LI元素對象(堆,有很多內置的屬性,也可以設置自定義屬性的)
// 每一輪循環的時候,給當前元素對象的堆內存中設置一個自定義屬性zhufeng,屬性值存儲當前LI元素對象的索引
// tabList = {
// 0:{zhufeng:0},
// 1:{zhufeng:1},
// ...
// }
tabList[i].zhufeng = i;
tabList[i].onclick = function () {
// 傳遞當前點擊這個LI的索引
// this => 當前點擊的這個LI,而我們基于它的自定義屬性zhufeng,就可以拿到它的索引
changeTab(this.zhufeng);
};
} */
//=>現在必須會的是自定義屬性
/* for (var i = 0; i < tabList.length; i++) {
tabList[i].zhufeng = i; //zhufeng保存了i的值
tabList[i].onclick = function () {
changeTab(this.zhufeng);
};
} */
/* 后期會講的方案 */
/* // 閉包
for (var i = 0; i < tabList.length; i++) {
tabList[i].onclick = (function (i) {
return function () {
changeTab(i);
};
})(i);
} */
// 基于let解決 (LET和VAR的區別)
/* for (let i = 0; i < tabList.length; i++) {
tabList[i].onclick = function () {
changeTab(i);
}
} */
// 這樣寫是不行的:點擊每一個LI的時候,綁定事件函數中的i都是3(循環結束后i的結果)
/*
i=0 第一輪循環 i++
tabList[0].onclick = function () {
此處是創建函數,函數存儲的是一堆破字符串,我們看到的i,也只是一個字符
“changeTab(i);”
}
i=1 第二輪循環 i++
tabList[1].onclick = function () {
“changeTab(i);”
}
i=2 第三輪循環 i++
tabList[2].onclick = function () {
“changeTab(i);”
}
i=3 循環結束
........
手欠點了第二個LI,觸發第二個LI綁定的函數
changeTab(i) 此時的i已經是循環結束后的3了
*/
for (var i = 0; i < tabList.length; i++) {
tabList[i].onclick = function () {
changeTab(i);
}
}
/* tabList[0].onclick = function () {
changeTab(0);
};
tabList[1].onclick = function () {
changeTab(1);
};
tabList[2].onclick = function () {
changeTab(2);
}; */
</script>
</body>
</html>
~~~

- 0001.開課說明
- 0002.ECMAScript的發展歷程
- 0003.WEB2.0時代-服務器端渲染,前后端不分離
- 0004.WEB2.0時代-前后端分離模式
- 0005.大前端時代概述
- 0006.前端需要的技術棧和學習技巧
- 0007.瀏覽器
- 0008.JS的三部分組成
- 0009.JS中創建變量的6種形式
- 0010.JS中變量的命名規范
- 0011.JS中的數據類型分類
- 0012.JS中常用的幾種輸出方式
- 0013.number屬性類型詳細解讀1
- 0014.number數據類型詳細解讀2
- 0015.string數據類型詳細解讀1
- 0016.string數據類型詳細解讀2
- 0017.boolean數據類型詳細解讀
- 0018.object數據類型詳細解讀1
- 0019.object數據類型詳細解讀2
- 0020.談談學習
- 0021.數據類型檢測
- 0022.瀏覽器底層渲染機制(堆棧內存和數據類型區別)
- 0023.關于數據類型區別的面試題
- 0024.課后作業講解:數據類型轉換
- 0025.課后作業講解:堆棧內存處理
- 0026.課后作業講解:阿里的一道經典面試題
- 0027.JS中三種常用的判斷語句
- 0028.小實戰:開關燈特效
- 0029.FOR循環和FOR IN循環
- 0030.課后作業講解:關于循環判斷和數據轉化
- 0031.課后作業講解:關于DOM對象的深入理解
- 0032.關于元素集合的相關操作(奇偶行變色)
- 0033.課后作業講解:邏輯思維判斷題
- reset.min.css
- 0034.(復習)前四天內容的綜合復習梳理
- 0035.初窺函數:函數的作用、語法、形參
- 0036-0038.選項卡案例
- 0039.隔行變色案例:進一步強化自定義屬性編程思想
- 0040.其它作業題的講解(自定義屬性強化)
- 0041.函數創建和執行的堆棧運行機制
- 0042.函數中的形參和實參
- 0043.函數中的實參集合ARGUMENTS
- 0044.函數中的返回值RETURN
- 0045.箭頭函數和匿名函數
- 0046.兩個等于比較時候的數據類型轉換規則
- 0047.數組的基礎結構和常規操作
- 0048.數組常用方法:增刪改的五個方法
- 0049.數組常用方法:查詢、拼接、轉換為字符串
- 0050.數組常用方法:檢測是否包含、排序和迭代
- 0051.數組去重:雙FOR循環(數組塌陷和SPLICE刪除優化)
- 0052.數組去重:對象鍵值對方式(ES6中SET)
- 0053.Math數學函數對象中常用的方法
- 0054.String字符串中常用的方法
- 0055.實戰案例:時間字符串格式化
- 0056.實戰案例:queryURLParams1
- 0057.實戰案例:queryURLParams2
- 0058.實戰案例:獲取四位不重復的驗證碼
- 0059.階段作業題講解1(基礎知識)
- 0060.階段作業題講解2(實戰案例)
- 0061-0062.DOM操作中相關知識的復習
- 0063.DOM中的節點操作1
- 0064.DOM中的節點操作2
- utils
- 65.關于DOM的增刪改