上次的tab切换的代码里面有很多重复的代码,需要做做优化,把重复的代码用函数封装起来调用。
优化前:
1 <script> 2 //获取id封装成一个函数$()方便调用 3 function $(id){ 4 //如果传入的参数类型为字符串则获取当前ID元素,否则返回id 5 return typeof id==="string"?document.getElementById(id):id; 6 } 7 function tab(){ 8 //声明 索引index,两个变量来装定时器,一个轮播定时器,一个延时定时器 9 var index=0,timer=null,timer2=null; 10 var titles=$('notice-tit').getElementsByTagName('li'); 11 var divs=$('notice-con').getElementsByTagName('div'); 12 for(var j=0;j<titles.length;j++){ 13 //给每个li设置ID 14 titles[j].id=j; 15 //给每个li绑定悬浮事件 16 titles[j].onmouseover=function(){ 17 //悬浮时首先清除延时定时器 18 clearInterval(timer); 19 //清除轮播定时器 20 clearTimeout(timer2); 21 //初始化两个定时器 22 timer2=null; 23 timer=null; 24 //this的一个引用,因为在setTimeout中this指向window对象 25 var that=this; 26 //创建一个延时定时器 27 timer2=setTimeout(function(){ 28 for(var i=0;i<titles.length;i++){ 29 titles[i].className=""; 30 divs[i].style.display="none"; 31 } 32 titles[that.id].className="select"; 33 divs[that.id].style.display="block"; 34 //鼠标悬浮时改变index的值为当前的id 35 index=that.id; 36 },500); 37 } 38 //给每个Li绑定鼠标离开时的事件 39 titles[j].onmouseout=function(){ 40 //创建一个轮播定时器,离开时轮播能继续进行,因为上面设置了index=that 41 //所以鼠标离开后会自动播放下一个tab 42 timer=setInterval(function(){ 43 index++; 44 if(index>=titles.length){ 45 index=0; 46 } 47 for(var i=0;i<titles.length;i++){ 48 titles[i].className=""; 49 divs[i].style.display="none"; 50 } 51 titles[index].className="select"; 52 divs[index].style.display="block"; 53 },2000); 54 } 55 } 56 //创建之前看是否存在轮播定时器,有就清除掉 57 if(timer){ 58 clearInterval(timer); 59 timer=null; 60 } 61 //创建一个轮播定时器 62 timer=setInterval(function(){ 63 index++; 64 if(index>=titles.length){ 65 index=0; 66 } 67 for(var i=0;i<titles.length;i++){ 68 titles[i].className=""; 69 divs[i].style.display="none"; 70 } 71 titles[index].className="select"; 72 divs[index].style.display="block"; 73 },2000); 74 } 75 tab(); 76 </script>
优化后:
1 <script> 2 //获取id封装成一个函数$()方便调用 3 function $(id){ 4 //如果传入的参数类型为字符串则获取当前ID元素,否则返回id 5 return typeof id==="string"?document.getElementById(id):id; 6 } 7 function tab(){ 8 //声明 索引index,两个变量来装定时器,一个轮播定时器,一个延时定时器 9 var index=0,timer=null,timer2=null; 10 var titles=$('notice-tit').getElementsByTagName('li'); 11 var divs=$('notice-con').getElementsByTagName('div'); 12 for(var j=0;j<titles.length;j++){ 13 //给每个li设置ID 14 titles[j].id=j; 15 //给每个li绑定悬浮事件 16 titles[j].onmouseover=function(){ 17 //悬浮时首先清除延时定时器 18 clearInterval(timer); 19 //清除轮播定时器 20 clearTimeout(timer2); 21 //初始化两个定时器 22 timer2=null; 23 timer=null; 24 //this的一个引用,因为在setTimeout中this指向window对象 25 var that=this; 26 //创建一个延时定时器 27 timer2=setTimeout(function(){ 28 changeOption(that.id); 29 //鼠标悬浮时改变index的值为当前的id 30 index=that.id; 31 },500); 32 } 33 //给每个Li绑定鼠标离开时的事件 34 titles[j].onmouseout=function(){ 35 //创建一个轮播定时器,离开时轮播能继续进行,因为上面设置了index=that 36 //所以鼠标离开后会自动播放下一个tab 37 timer=setInterval(autoPlay,2000); 38 } 39 } 40 //创建之前看是否存在轮播定时器,有就清除掉 41 if(timer){ 42 clearInterval(timer); 43 timer=null; 44 } 45 //创建一个轮播定时器 46 timer=setInterval(autoPlay,2000); 47 function autoPlay(){ 48 index++; 49 if(index>=titles.length){ 50 index=0; 51 } 52 changeOption(index); 53 } 54 function changeOption(curindex){ 55 for(var i=0;i<titles.length;i++){ 56 titles[i].className=""; 57 divs[i].style.display="none"; 58 } 59 titles[curindex].className="select"; 60 divs[curindex].style.display="block"; 61 } 62 } 63 64 tab();
代码中三处重复的for循环清除 className display的属性,和下面给当前索引添加属性,所以需要把他们封装成函数,但是三处也不是全部一样,索引的值不同,可以给封装的函数changeOption()传入参数来解决.
然后发现自动轮播有两处是一样的,封装成函数autoPlay(),来调用它。
要记得,只要出现了重复都可以用函数来封装调用。