1

所以我做了一个简单的计时器,格式如下:MM:SS.MS

您可以在此处查看 [已删除]
它在 chrome、IE 等中运行良好,但在 Firefox 中,秒数是原来的两倍。

我看了一些其他的秒表,但我并没有完全理解它们。最好的方法是什么?现在我有一个 10 毫秒的间隔来生成计时器。

该函数看起来像这样,我希望它可以理解:

var state = false;
var msTimer = null;

var min = document.getElementById("min");
var sec = document.getElementById("sec");
var ms = document.getElementById("ms");

var minCount = 0;
var secCount = 0;
var msCount = 0;


document.onkeydown = function timer(e) {

if (!e) { e = window.event; }

if (e.keyCode == "32") {

    if (state == false) {
        state = true;

        min.innerHTML = "00";
        sec.innerHTML = "00";
        ms.innerHTML = "00";

        msTimer = window.setInterval(function() {
            if (msCount == 99) {

                msCount = 0;
                secCount++;

                // Minutes
                if (secCount == 60) {

                    secCount = 0;
                    minCount++;

                    if (minCount <= 9)
                    { min.innerHTML = "0" + minCount; }
                    else
                    { min.innerHTML = minCount; }
                }

                // Seconds
                if (secCount <= 9)
                { sec.innerHTML = "0" + secCount; }
                else
                { sec.innerHTML = secCount; }

            } else { msCount++; }

            // Miliseconds
            if (msCount <= 9)
            { ms.innerHTML = "0" + msCount; }
            else
            { ms.innerHTML = msCount; }

            // 1 Hour
            if (minCount == 60) {

                clearInterval(msTimer);

                min.innerHTML = "N0";
                sec.innerHTML = "00";
                ms.innerHTML = "0B";

                state = false;

                minCount = 0;
                secCount = 0;
                msCount = 0;
            }
        }, 10);

    } else if (state == true) {
        state = false;

        clearInterval(msTimer);

        minCount = 0;
        secCount = 0;
        msCount = 0;
    }
}

感谢您的任何建议:)

编辑:

顺便说一句,如果我从计时器中删除所有样式,它在 Firefox 中会更流畅。但这不可能是解决方案..

4

2 回答 2

3

你不应该依赖定时器的间隔正好是10 毫秒。如果您将每个计时器滴答视为刷新屏幕计时器的请求,但从系统时钟或类似的东西中获取测量值,那会更好。

然后,无论机器(和 JS 实现)有多慢或多忙,你总会看到一个准确的计时器1 - 只是一个更新频率较低的计时器。


1当然,这只会与系统时钟一样准确。Stopwatch如果 Javascript 可以访问像 .NET 的类或 Java 的方法这样的高性能计时器System.nanoTime(),那会更好用。

于 2011-10-26T06:13:34.013 回答
1

无法保证 Javascript 中的时间。一个 10 毫秒的间隔只会是大约 10 毫秒,很可能每次都会延迟一点。在 Javascript 中执行计时器的正确方法是在启动计时器时保存一个起始时间戳,然后每隔 10 毫秒左右计算起始时间戳和当前时间之间的差异,并使用格式化值更新页面上的元素。

于 2011-10-26T06:16:31.697 回答