javascript设置间隔-倒计时滞后

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

我使用下面的代码以秒为单位进行倒计时。问题是,当使用jquery.load再次加载包含倒计时的页面部分时,新的倒计时会出错:每秒钟,我们会看到快2秒,如下所示:9-8…7-6…5-4。。。好像它没有和时钟同步。。。请看这里:aorbaroquethrash.com/test(为了解决问题,我必须在您在场时更改歌曲)

你知道我怎么解决这个问题吗

<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()
,以计算自开始时间以来经过的时间。“这要准确得多。”特罗涅——我在回答中举了一个有效的例子。