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; } } };