1. 程式人生 > >通過自定義屬性,排他的原理實現列表的表頭和對應內容的切換

通過自定義屬性,排他的原理實現列表的表頭和對應內容的切換

要點:

1.自定義屬性,可以用來存放類似於這個案例中索引的不是自帶的屬效能滿足的,通過setAttribute("自定義屬性名",值)來自定義一個屬性,切記不可直接通過this.自定義屬性來設定值

   同時,獲取和移除自定義屬性,分別是getAttribute()和removeAttribute()來實現,removeAttribute()可以將屬性徹底刪除掉,自帶的屬性也可以徹底刪除,而不是將其賦值為null

2.程式的原則,其中有一個原則是經可能的快,這個例項本來我準備將li標籤,存放在偽陣列中的這個操作,放在下面將bd內容替換的操作附近,因為邏輯感超棒。但是,我忽略了 ,每次迴圈獲取一次會拖慢速度,下次注意。

3.針對與這個案例,核心思想是上下兩個對應元素的操作應該對應,這也就是為什麼新增索引。

 

html程式碼和內建j程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
    * {
      margin: 0;
      padding: 0;
    }

    ul {
      list-style-type: none;
    }

    .box {
      width: 400px;
      height: 300px;
      border: 1px solid #ccc;
      margin: 100px auto;
      overflow: hidden;
    }

    .hd {
      height: 45px;
    }

    .hd span {
      display: inline-block;
      width: 90px;
      background-color: pink;
      line-height: 45px;
      text-align: center;
      cursor: pointer;
    }

    .hd span.current {
      background-color: purple;
    }

    .bd li {
      height: 255px;
      background-color: purple;
      display: none;
    }

    .bd li.current {
      display: block;
    }
  </style>
</head>
<body>
   <div class="box" id="box">
	  <div class="hd">
	    <span class="current">陳小帥</span>
	    <span>陳大帥</span>
	    <span>陳帥帥</span>
	    <span>chenxiaoshuai</span>
	  </div>
	  <div class="bd">
	    <ul>
	      <li class="current">陳小帥是真的帥</li>
	      <li>陳大帥是真的帥</li>
	      <li>陳帥帥是真的帥</li>
	      <li>chenxiaoshuai是真的帥</li>
	    </ul>
	  </div>
    </div>
   
    <script type="text/javascript">
    	function my$(id){
    		return document.getElementById(id);
    	}

    	var box = my$("box");
    	// 先通過id獲取hd和bd的盒子

    	var hd = box.getElementsByTagName('div')[0];
    	// js中字串目前單引號和雙引號沒有區分,有時雙引號內部巢狀雙引號引起錯誤的話,將內部的雙引號改為單引號
    	var bd = box.getElementsByTagName('div')[1];
    	// 上面分別獲取兩個div的盒子,通過getElementsByTagName()獲取到的物件儲存到偽陣列中,通過陣列的方法呼叫偽元素中的標籤

    	var lis = bd.getElementsByTagName("li");
        // 獲取ul下面所有的li標籤,儲存在偽陣列lis中
        // 這段程式碼原來為了更具有邏輯性,放在下面的k迴圈的,但是考慮到每次迴圈獲取一次,會拖慢執行效率

    	var spans = hd.getElementsByTagName('span');
    	for(var i=0; i<spans.length;i++){

            spans[i].setAttribute("index",i);
            // 在執行迴圈之前,將每個位置的索引新增一下,後面對應的索引做相同的操作

            spans[i].onclick = function(){
            	for(var j=0;j<spans.length;j++){
            		spans[j].removeAttribute("class");
            		// 跟div只用一個屬性的排他性,寫的方法一致,先清除所有的樣式
            	}	
            	this.className = "current";
                // 將被點選選中的元素的類名設定為current高亮顯示
                
                var index = this.getAttribute("index");
                // 被點選之後,先將樣式改變一下,再將點選的元素索引獲取到,用在下面對應位置的元素的索引  

                for(var k=0;k<lis.length;k++){
                	lis[k].removeAttribute("class");
                }
                // 將下面的div的類名全部清除

                lis[index].className = "current";
                // 通過相同位置的索引,將下面顯示對應的標籤
            }
    	}
    </script>

</body> 	
</html>

效果: