js-Tab切换

03 Oct 2014


  // 把获取id单独封装为一个函数
  function _$(id){
    return typeof id === 'string' ? document.getElementById(id) : id;
  }

  window.onload = function(){
    // 没有延迟的切换效果========================================================
    // 获取鼠标滑过或点击的标签和要切换内容的元素
    var titles = _$('notice-tit').getElementsByTagName('li'),
        divs = _$('notice-con').getElementsByTagName('div');
        // alert(titles.length)
    if (titles.length != divs.length) {
      return;
    }

    // 遍历titles下的所有li
    for (var i = 0;i < titles.length; i++) {
      titles[i].id = i;
      titles[i].onmouseover = function(){ // onclick
        // alert(this.id);
        // 清楚所有li上的class
        for (var j = 0; j < titles.length; j++) {
          titles[j].className = '';
          divs[j].style.display = 'none';
        }
        //设置当前为高亮显示
        this.className = 'active';
        divs[this.id].style.display = 'block';
      }
    }



    // 延迟切换 beginning ====================================================
    // 标签的索引
    var index = 0;
    var timer = null;

    var delayTits = _$('notice-delay-tit').getElementsByTagName('li'),
        delayDivs = _$('notice-delay-con').getElementsByTagName('div');

    if (delayTits.length != delayDivs.length) {
      return;
    }
    // console.log(delayDivs.length)
    // 遍历所有的页签
    for(var m = 0; m < delayTits.length; m++){
      delayTits[m].id = 'delay' + m;
      delayTits[m].onmouseover = function(){
        // 用that这个变量来引用当前滑过的li
        var that = this;
        // 如果存在了准备执行的定时器,立刻清除,只有当前停留时间大于500ms时才开始执行
        if (timer) {
          clearTimeout(timer);
          timer = null;
        }
        // 延迟半秒执行
        timer = setTimeout(function(){ //setTimeout()的全称是window.setTimeout(),setTimeout()是window的方法。window的所有方法和属性都可以省略window,所以此时的this是window
          for(var n = 0; n < delayTits.length; n++){
            delayTits[n].className = '';
            delayDivs[n].style.display = 'none';
          }
          // alert(this);// 此时的this变成了window
          delayTits[that.id].className = 'active';
          delayDivs[that.id.slice(5)].style.display = 'block';
        }, 500);

      }
    }



    // 自动切换 beginning ====================================================
    // 当前高亮显示的页签的索引
    var index = 0;
    var timerAuto = null;

    var autoTits = _$('notice-auto-tit').getElementsByTagName('li'),
        autoDivs = _$('notice-auto-con').getElementsByTagName('div');

    // 变量每一个页签且给他们绑定事件
    for(var x = 0; x < autoTits.length; x++){
      autoTits[x].id = 'auto' + x;
      autoTits[x].onmouseover = function(){
        clearTimeout(timerAuto);
        changeOption(this.id.slice(4));
      }
      autoTits[x].onmouseout = function(){
        // clearTimeout(timerAuto);
        timerAuto = setInterval(autoPlay, 2000);
      }
    }

    if (timerAuto) {
      clearTimeout(timerAuto);
      timerAuto = null;
    }
    // 添加定时器,改变当前高亮的索引
    timerAuto = setInterval(autoPlay, 2000);

    function autoPlay(){
      index++;
      if (index >= autoTits.length) {
        index = 0;
      }
      changeOption(index);
    }

    function changeOption(curIndex){
      for(var d = 0; d < autoTits.length; d++){
        autoTits[d].className = '';
        autoDivs[d].style.display = 'none';
      }
      // console.log(index);
      autoTits[curIndex].className = 'active';
      autoDivs[curIndex].style.display = 'block';
      index = curIndex;
    }
  }