javascript设置间隔-倒计时滞后
我使用下面的代码以秒为单位进行倒计时。问题是,当使用jquery.load再次加载包含倒计时的页面部分时,新的倒计时会出错:每秒钟,我们会看到快2秒,如下所示:9-8…7-6…5-4。。。好像它没有和时钟同步。。。请看这里:aorbaroquethrash.com/test(为了解决问题,我必须在您在场时更改歌曲) 你知道我怎么解决这个问题吗javascript设置间隔-倒计时滞后,javascript,setinterval,countdown,Javascript,Setinterval,Countdown,我使用下面的代码以秒为单位进行倒计时。问题是,当使用jquery.load再次加载包含倒计时的页面部分时,新的倒计时会出错:每秒钟,我们会看到快2秒,如下所示:9-8…7-6…5-4。。。好像它没有和时钟同步。。。请看这里:aorbaroquethrash.com/test(为了解决问题,我必须在您在场时更改歌曲) 你知道我怎么解决这个问题吗 <script type = "text/javascript"> /*author Philip M. 2010*/ var timeIn
<script type = "text/javascript">
/*author Philip M. 2010*/
var timeInSecs;
var ticker;
function startTimer(secs){
timeInSecs = parseInt(secs)-1;
ticker = setInterval("tick()",1000); // every second
}
function tick() {
var secs = timeInSecs;
if (secs>0) {
timeInSecs--;
}
else {
clearInterval(ticker); // stop counting at zero
}
document.getElementById("countdown").innerHTML = secs;
}
startTimer(<?php echo $stream['info']['length'];?>);
</script>
/*作者Philip M.2010*/
时间昆虫;
var-ticker;
功能启动计时器(秒){
timeInSecs=parseInt(secs)-1;
ticker=setInterval(“tick()”,1000);//每秒
}
函数tick(){
var secs=时间单位;
如果(秒>0){
时光虫;
}
否则{
clearInterval(滴答声);//在零处停止计数
}
document.getElementById(“倒计时”).innerHTML=secs;
}
startTimer();
Patrick您应该使用当前系统时间来显示或计算经过的秒数,而不是自己计算
setInterval()
不能保证完全按时调用,当您仅计算自己时,可能会出现累积错误,如果未按时调用,您将显示错误的时间
记录您开始计数的时间,然后在每个刻度上,获取新的系统时间,并计算自您开始计数以来经过的时间(无累积错误)
另外,请不要将字符串传递给
setInterval()
。传递真正的函数引用,因为这样可以防止范围界定问题和其他潜在问题
下面是倒计时计时器的工作代码示例:
var startTime, countAmt, interval;
function now() {
return ((new Date()).getTime());
}
function tick() {
var elapsed = now() - startTime;
var cnt = countAmt - elapsed;
var elem = document.getElementById("counter");
if (cnt > 0) {
elem.innerHTML = Math.round(cnt / 1000);
} else {
elem.innerHTML = "0";
clearInterval(interval);
}
}
function startTimer(secs) {
clearInterval(interval);
document.getElementById("counter").innerHTML = secs;
countAmt = secs * 1000;
startTime = now();
interval = setInterval(tick, 1000);
}
startTimer(20);
工作演示:谢谢大家
我需要添加“clearInterval(股票代码);”在函数startTimer的开头。我将此添加到jfriend00脚本中,以获得“分钟:秒”:
function minute(secs){
minVar = Math.floor(secs/60);
secs = secs % 60;
if (secs < 10) {
secs = "0"+secs;
}
return minVar+":"+secs;
}
功能分钟(秒){
minVar=数学层(秒/60);
秒=秒%60;
如果(秒<10){
secs=“0”+秒;
}
返回minVar+“:”+秒;
}
添加到:
elem.innerHTML=分钟(数学圆(cnt/1000));
和
document.getElementById(“倒计时”).innerHTML=分钟(秒) 剧本有可能出现两次吗?好的。。。网络已设置为记录所有内容,我的声卡已静音,现在让我们等待三分钟。正如预期的那样。。。每次更改后,时钟开始越来越快地滴答作响。当您更改歌曲时发生的导致您无法清除计时器的引用错误如何?你真的试过调试吗?简,你怎么看这个引用错误?也许我应该在有新歌的时候做“clearInterval”,但我还不知道怎么做。
setInterval
实际上不能漂移(但如果CPU负载很高,它可以跳过,这更糟糕)@JanDvorak-但是如果它没有按时调用或者间隔调用被跳过,那么OP的代码将显示错误的时间。好的。那么该怎么办呢?@trogne-我想这解释了。使用new Date().getTime()
(系统时间)开始测量时间时,将其存储在变量中作为开始时间,然后在每次计时器调用时再次使用new Date().getTime()
,以计算自开始时间以来经过的时间。“这要准确得多。”特罗涅——我在回答中举了一个有效的例子。