嘿,我在这里张贴了这些代码: http://jsfiddle.net/mN6Gy/12/
问题是它在秒内跳过数字(从30,25,24,23,22,21,20,15 ......开始)
一旦秒数达到00,它就会重新开始99,98,97,96 ...... !!
在代码中找到这个的任何帮助都会很棒!
谢谢,
大卫
答案 0 :(得分:1)
哦,小伙子,这对调试来说并不好玩 - 而且我不确定我是否有所有的答案......
我发现的问题是你有太多的日子,所以你的索引已关闭。
Options.format: "dd:hh:mm:ss"
> Actually have '119:01:16:18' (for example)
所以当你循环时,你的所有索引都会被一个 - 现在。但是当时间达到<100天时,我认为是正确的。
作为一个了解我的意思的hacky解决方案(因此您可能有一个地方可以开始修复),请参阅此编辑代码段:
switch (options.format[i]) {
case 'h':
digits[c].__max = ((c-1) % 2 == 0) ? 2: 9; // <== EDIT
if (c % 2 == 0)
digits[c].__condmax = 4;
break;
case 'd':
digits[c].__max = 9;
break;
case 'm':
case 's':
digits[c].__max = ((c-1) % 2 == 0) ? 5: 9; // <== EDIT
}
答案 1 :(得分:-1)
通常,代码似乎运行正常 - 在x
秒之后,计数器会减少x
。代码中的setInterval()
函数
setInterval(moveStep(digits.length - 1), 1000);
每1000毫秒调用moveStep()
,即每秒。但是,您不能指望您的计算机,操作系统和浏览器在几毫秒内完全精确。有时事件会更快触发,有时会触发更晚(特别是如果您还运行可能会干扰或减慢代码的其他程序)。所以它可能会发生,而不是
counter=2 - 1 second delay - counter=1 - 1 second delay - counter=0
你得到了
counter=2 - 2 second delay - counter=1 - counter=0
或类似的东西。在这种情况下,您不会看到counter=1
,因为当下一个事件触发并且counter
设置为0
时会立即重新绘制。{/ p>
您可以做的一件事是使用setTimeout
代替setInterval
,所以你得到了
var callback = function() {
moveStep(digits.length - 1);
setTimeOut(callback, 1000);
}
setTimeOut(callback, 1000);
在这种情况下,定时事件不会排在队列中,然后立即触发,就像在前一种情况下一样。这是因为您没有设置间隔,而只是设置超时 - 下一个事件计划在当前事件完成后1秒发生。这样,两个事件之间的时间总是(大约)1秒。
但是,这里的问题与世界差不多。在第一种情况下,setInterval()
从现在起安排事件发生1秒,2秒,3秒等,因此在x
秒后,您的计数器应减少x
,尽管它有时不会在每一步重绘。但是,在第二种情况下,当使用setTimeout
时,1000毫秒的微小偏差可能会慢慢增加,因此在x*1.1
秒后,您的计数器将减少x
,或类似的东西。换句话说,你不能保证它准时。
总结一下,你面临setInterval
的常见问题,我认为没有太多事情可做。