0

我想实现一个计数计时器JS代码,从0开始在每个加载页面开始计数。我现在的代码是这样的:

var secondsTotal = 0;

setInterval(function() {
    ++secondsTotal;
    var minutes = Math.floor(secondsTotal / 60);
    var seconds = Math.floor(secondsTotal)  % 60;
    var milliseconds = Math.floor(secondsTotal) % 1000;

    document.getElementById('counter').innerHTML = minutes + ":" + seconds + "." + milliseconds;
}, 1000);

输出格式应为:00:00.0

毫米:ss.ms

那么,如何输出上述格式的结果(分钟和秒应该以两位数格式精确打印)?

4

2 回答 2

3

如果您想按页面进行操作,那么您就快到了。现在,您的代码不允许您跟踪毫秒,因为您setInterval每秒运行一次。我会推荐的是这样的:

(function() {
     var counter = 0,
     cDisplay = document.getElementById("counter");
     format = function(t) {
         var minutes = Math.floor(t/600),
             seconds = Math.floor( (t/10) % 60);
         minutes = (minutes < 10) ? "0" + minutes.toString() : minutes.toString();
         seconds = (seconds < 10) ? "0" + seconds.toString() : seconds.toString();
         cDisplay.innerHTML = minutes + ":" + seconds + "." + Math.floor(t % 10);
     };
    setInterval(function() {
       counter++;
       format(counter);
    },100);
})();

这做了几件事来让你的代码每秒运行 10 次:

  • 输出元素 ,#counter被缓存而不是每次迭代都检索
  • 格式仅保留为算术运算 - 模和除法。

现在这也添加了前导零。

如果您想保持此计数器逐页运行,请考虑使用document.cookies将最终值从一页传递到另一页。

小提琴

这是一个很好的第一个版本。但是,您可能想要:

  • 暂停/重新启动您的计时器
  • 重置你的计时器
  • 有多个计时器

出于这个原因,我将添加上述代码的稍微复杂的形式,这将允许您管理多个计时器。这将利用一些 OO 概念。我们将使用一个TimerManager对象来“托管”我们的计时器,每个Timer对象都有一个到管理器的链接。

这样做的原因是因为每个计时器都将setInterval()通过这种方式依赖于相同的计时器,而不是进行多次setInterval()调用。这使您可以减少浪费的时钟周期。

大约 5 分钟后了解更多信息!

于 2013-05-30T14:03:54.297 回答
-1

不能保证以这种方式计算秒数是准确的。setInterval 方法可能会根据 JS 引擎完成其其他任务的能力而随你而变。不确定您的用例是什么,例如您希望计算多长时间,但值得注意的是。请参阅setInterval 会漂移吗?详细说明。

我建议您查看 momentjs 插件 @ http://momentjs.com/并将您的代码更新为如下所示

var startTime = moment();
var el = document.getElementById('counter');
setInterval(function() {
      var ms = moment().diff(startTime),
          min = moment.duration(ms).minutes(),
          sec = moment.duration(ms).seconds();
      ms = moment.duration(ms).milliseconds(); 
      min = (min < 10) ? "0" + min.toString() : min.toString();
      sec = (sec < 10) ? "0" + sec.toString() : sec.toString();
      ms = ms.toString().substring(0,2); // change this if you want to expand ms counter display
      el.innerHtml = min + ":" + sec + "." + ms;
}, 50);

您可以自由更新间隔,并且您的毫秒数显示而无需调整您的计算。

于 2013-05-30T14:12:02.713 回答