倒数计数正确

时间:2012-04-27 21:06:13

标签: javascript jquery countdown

嘿,我在这里张贴了这些代码: http://jsfiddle.net/mN6Gy/12/

问题是它在秒内跳过数字(从30,25,24,23,22,21,20,15 ......开始)

一旦秒数达到00,它就会重新开始99,98,97,96 ...... !!

在代码中找到这个的任何帮助都会很棒!

谢谢,

大卫

2 个答案:

答案 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的常见问题,我认为没有太多事情可做。