我的小提琴链接如下:http://jsfiddle.net/FvYyS/2/
函数调用如下:
load_timer('0', '6', '9', 0, '0', '', '0');
其实我的问题是小提琴不起作用。该代码的预期行为是计时器应该逐秒减小并最终达到零(即,例如计时器应该从00:06:09开始并在00:00:00结束)。但它并没有在这里工作。代码在我的应用程序中正常工作,但不知道为什么这段代码不适合小提琴。我在我的应用程序中注意到的另一个问题是计时器落后了一段时间。有人可以帮我这方面吗?如果您需要任何进一步的信息,我会为您提供相同的信息。提前谢谢。
答案 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
列入你的小提琴
答案 2 :(得分:0)
您的方法存在一些问题:
由于您在完成某项工作后执行setTimeout
,因此完成工作所需的时间将延迟下一次迭代。你可以通过将setTimeout
调用移动到第一个执行然后完成工作来解决这个问题。
使用setTimeout(f, timeout)
可确保在f
调用后timeout
函数执行至少 setTimeout
毫秒。因此,如果例如当应该执行对f的调用时浏览器忙1秒,则对f的调用被延迟1秒。此外,对setTimeout的下一次调用会延迟第二次,因此在此之后发生的所有操作都会导致延迟。
更好的解决方法是使用setInterval
,它设计为每隔n毫秒重复一次任务,并缓解周期性延迟问题。
最后,问题的最佳解决方案是使用Date
来确定计数器的开始时间,并通过从当前时间减去原始时间来显示经过的确切时间。