• tab切换代码优化


    上次的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(),来调用它。

    要记得,只要出现了重复都可以用函数来封装调用。

  • 相关阅读:
    第五周总结
    10.24号进度报告
    10.23日进度报告
    10.22日进度报告
    10.21日进度报告
    10.20号进度总结
    10.19日进度总结
    第四周总结
    10.18日进度博客
    2020下第六周总结
  • 原文地址:https://www.cnblogs.com/yewenxiang/p/6087439.html
Copyright © 2020-2023  润新知