js 大批量 倒计时器
最近写的一个超大的定时倒计时器。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;
}
}
};