最近写的一个超大的定时倒计时器。200个倒计时执行一次耗时,ie下40ms,firefox下11ms,chrome下3ms。

主要是 ie dom 慢 。ie外其他浏览器会很流畅。 chrome firefox 5000个倒计时不成问题。

可以设置误差时间。

var countdownBox={
  arrObjs : new Array(),
  counts : 0,
  timeNow : "",
  mistakeTime: 0,
  statistics : {
    c : 1,
    w_time : 0
  },
  setMistakeTime : function(serverTime)
  {
    var t_date = new Date();
    var s_date = new Date(serverTime);
    this.mistakeTime = (t_date-s_date)<2000?0:(t_date-s_date);
  },
  addOne:function(endtime,showday,id){
    var obj = document.getElementById(id);
    this.arrObjs[this.counts] = new Array(0 //timeout 标记
                                        ,new Date(endtime),showday,obj);
    this.counts++;
  },
  run : function(){
    this.timeNow = new Date();
    this.timeNow = this.timeNow-this.mistakeTime;
    var i = (this.counts)%8;
    while (i) {
      this.runUnit(this.arrObjs[i--]);
    }
    var count=this.counts-1;
    var i = Math.floor( count/8 );
    //经典之处 在于此,可有效缓解大批量 的倒计时。
    while(i) {
      this.runUnit(this.arrObjs[count--]);
      this.runUnit(this.arrObjs[count--]);
      this.runUnit(this.arrObjs[count--]);
      this.runUnit(this.arrObjs[count--]);
      i--;
    }
  },
  runUnit : function(t_obj){
    if(t_obj[0]==0) {
      this.show(t_obj[1], t_obj[2], t_obj[3],i);
    }
  },
  // 推送到 具体某个计时器
  show : function(endtime,showday,obj,key) {
    lefttime = parseInt((endtime-this.timeNow)/1000);
    if(lefttime<=0) {
      obj.innerHTML=showday==0?"00:00:00":"0天 00:00:00";
      this.arrObjs[key][0]=1;
    } else {
      var day=Math.floor(lefttime/86400);
      var hour=Math.floor(lefttime/3600-24*day);
      if(hour<10){hour="0"+hour;}
      var minute=Math.floor((lefttime%3600)/60);
      if(minute<10){minute="0"+minute;}
      var second=lefttime%60;
      if(second<10){second="0"+second;}
      var t_time= hour + ":" + minute + ":" + second;
      obj.innerHTML=showday==0?t_time:day + "天 " + t_time;
    }
  }
};