+ -
当前位置:首页 → 问答吧 → js倒计时的一个问题

js倒计时的一个问题

时间:2011-09-13

来源:互联网

我重服务器端取回一个 时间戳

然后页面 setinterval 倒计时

页面 过一会 在刷新 发现时间 有延迟 差了几十秒  时间长了 还出现差了 几分钟(秒杀程序 差这么多有点说不过去)

有没有好的方法解决

代码很简单 就是setinterval   就不发了

作者: 125989100   发布时间: 2011-09-13

引用:
原帖由 125989100 于 2011-9-13 20:39 发表
我重服务器端取回一个 时间戳

然后页面 setinterval 倒计时

页面 过一会 在刷新 发现时间 有延迟 差了几十秒  时间长了 还出现差了 几分钟(秒杀程序 差这么多有点说不过去)

有没有好的方法解决

代码很 ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <div id="timer"> <span></span>年 <span></span>月 <span></span>日 <span></span>分 <span></span>秒 </div> <div id="_timer"> <span></span>年 <span></span>月 <span></span>日 <span></span>分 <span></span>秒 </div> <script> /* @author : suntiger035 @date : 2010.10.12 @description : daojishi */ function timer(options){ this.init(options); } timer.prototype = { init : function(options){ this.setting = options; this.element = this.setting.icontainer; this.endDate = new Date(this.setting.time).getTime(); this.timer = null; this.run(); }, run : function(){ clearTimeout(this.timer); var startTime = new Date().getTime(); var interval = Math.round((this.endDate - startTime) / 1000); if(interval >= 0){ var _year = Math.floor(interval/60/60/24/30) > 0 ? this.handleNumber(Math.floor(interval/60/60/24/30%12)) : "00"; var _day = Math.floor(interval/60/60/24) > 0 ? this.handleNumber(Math.floor(interval/60/60/24%30)) : "00"; var _hour = Math.floor(interval/60/60) > 0 ? this.handleNumber(Math.floor(interval/60/60%24)) : "00"; var _minute = Math.floor(interval/60) > 0 ? this.handleNumber(Math.floor(interval/60%60)) : "00"; var _second = Math.floor(interval) > 0 ? this.handleNumber(Math.floor(interval%60)) : "00"; var arr = [_year,_day,_hour,_minute,_second]; for(var i = 0;i < this.element.length;i++){ if(this.element[i][1]) this.element[i][0].innerHTML = arr[i]; } var self = this; this.timer = setTimeout(function(){ self.run(); },1000); }else{ clearTimeout(this.timer); alert("完啦!"); } }, handleNumber : function(n){ var n = parseInt(n, 10); if(n > 0){ if(n <= 9){ n = "0" + n; } return String(n); }else{ return "00"; } } }; var _span = document.getElementById("timer").getElementsByTagName("span"); var __span = document.getElementById("_timer").getElementsByTagName("span"); new timer({ icontainer : [[_span[0],false],[_span[1],true],[_span[2],true],[_span[3],true],[_span[4],true]], time : "2014/11/1" }); new timer({ icontainer : [[__span[0],true],[__span[1],true],[__span[2],true],[__span[3],true],[__span[4],true]], time : "2010/11/1" }); </script> </body> </html>
 提示:您可以先修改部分代码再运行
哥们,这是我以前整的,你看能不能用,或者自己改下

作者: suntiger035   发布时间: 2011-09-13

setinterval里是用本地时间的差值来计算,或者每次运行加x毫秒?
估计是后者,不然误差不会累加。
-----
建议使用本地时间,提醒用户同步(windows的自带时间同步就可以了)
或者先计算服务器和本地时间的差值

作者: zhanyuzai   发布时间: 2011-09-13