这个位置我们也是可以设置的。在给每个li添加事件的时候用到了for里面的参数i在这里表示0,1,2可以表示标题块之间的相对位置(lis[i].index = i),这也正是盒子块之间的相对位置。我们可以通过divs[this.index]来获取被点击标题对应的盒子。
var divs = document.getElementById("tab").getElementsByTagName("div");
//console.log(divs)
 for(let i=0; i<lis.length; i++){
 lis[i].index = i;
 lis[i].onclick = function() {
 	for( let n=0; n<lis.length; n++){
 	lis[n].className = "";
 	divs[n].className = "hide";
 	}
 	this.className = "on";
 	divs[this.index].className = "";
 	}
 }	
到这里,题目要求的所有效果都实现了,回头看看,感觉不是很难,但是当时在刚看到题目的时候还是很懵的,不知道如何获取被点击的标题(想到了冒泡和捕获,后面还需要对这个进行学习),不知道如何设置css....,自己还需要更多的学习。
——————————分割线—————
很多大佬都指导我说之前的方法耗内存:用for循环给每个li都添加一个点击事件。下面,我用事件委托来更新一下这个办法:
window.onload = function() {
 var uls = document.getElementById('tit');
 var lis = uls.getElementsByTagName('li');
 var divs = document.getElementById('tab').getElementsByTagName('div');
 // console.log(lis)
 console.log(divs)
 uls.onclick = function(ec) {
 for(let i=0; i<lis.length; i++){
 lis[i].className = ""; //遍历每个li设置类名
 divs[i].className = "hide"; 
 }
 var ev = ev || window.event;
 var target = ev.target || ev.srcElement;
 if(target.nodeName.toLowerCase() == 'li'){
 target.className = "on";
 //自己在每个li中定义了一个属性 data-index
 divs[target.getAttribute("data-index")].className = ""; 
 console.log(target);
 }
 } 
 }
我在html中给每个li自定了属性data-index:
<li class="on" data-index="0">房产</li> <li data-index="1">家居</li> <li data-index="2">二手房</li>
再在js中用getAttribute获取所点击的li的属性值
divs[target.getAttribute("data-index")].className = "";
源码链接
总结
下载本文