为什么小提琴不起作用,以下情况有时滞?

时间:2014-02-06 08:35:12

标签: javascript jquery html css timer

我的小提琴链接如下:http://jsfiddle.net/FvYyS/2/

函数调用如下:

 load_timer('0', '6', '9', 0, '0', '', '0');

其实我的问题是小提琴不起作用。该代码的预期行为是计时器应该逐秒减小并最终达到零(即,例如计时器应该从00:06:09开始并在00:00:00结束)。但它并没有在这里工作。代码在我的应用程序中正常工作,但不知道为什么这段代码不适合小提琴。我在我的应用程序中注意到的另一个问题是计时器落后了一段时间。有人可以帮我这方面吗?如果您需要任何进一步的信息,我会为您提供相同的信息。提前谢谢。

3 个答案:

答案 0 :(得分:2)

您的代码具有以下结构:

 var counter = delay;
 function loop() {
     counter--;
     displayTime(delay, counter);
     if (counter > 0) {
         setTimeout( loop, 1000 );
     }
 }

2件事:

  • displayTime()执行需要时间:例如,如果完成需要0.2秒,则循环将每1.2秒执行一次(而不是每秒执行一次)
  • setTimeout( ..., 1000 )表示“请亲爱的javascript运行时,你可以在1秒钟内运行我的代码吗?如果还有其他事情要做,我可以等待更多。”
    您可以保证在setTimeout电话和loop执行之间至少 1秒,但延迟可能会更长。

如果您想避免时间漂移,请在每次迭代时检查实际时间:

var start = Date.now();
function loop() {
    var now = Date.now();
    var elapsedTime = now - start; //elapsed time in milliseconds
    displayTime(delay, elapsedTime);
    if (elapsedTime < delay) {
        setTimeout(loop, 1000);
    }
}

答案 1 :(得分:1)

你没有将jquery library列入你的小提琴

参见 UPDATED FIDDLE

答案 2 :(得分:0)

您的方法存在一些问题:

由于您在完成某项工作后执行setTimeout,因此完成工作所需的时间将延迟下一次迭代。你可以通过将setTimeout调用移动到第一个执行然后完成工作来解决这个问题。

使用setTimeout(f, timeout)可确保在f调用后timeout函数执行至少 setTimeout毫秒。因此,如果例如当应该执行对f的调用时浏览器忙1秒,则对f的调用被延迟1秒。此外,对setTimeout的下一次调用会延迟第二次,因此在此之后发生的所有操作都会导致延迟。

更好的解决方法是使用setInterval,它设计为每隔n毫秒重复一次任务,并缓解周期性延迟问题。

最后,问题的最佳解决方案是使用Date来确定计数器的开始时间,并通过从当前时间减去原始时间来显示经过的确切时间。