Javascript在制表符交换上停止

时间:2014-06-02 05:09:38

标签: javascript jquery

我已经编写了一个jQuery插件,除了当你切换到另一个标签时脚本暂停,一切都很好。脚本的主体是setInterval(),延迟时间为1毫秒。

    var count = setInterval( function() {
            if (iMil <= 0) {
                if (iS == 0) {
                    if (iMin == 0) {
                        if (iH == 0) {
                            // DONE
                            milliseconds.text(0);
                            clearInterval(count);
                        } else {
                            iH--;
                            iMin = 59;
                            iS = 59;
                            iMil = 999;
                        }
                    } else {
                        iMin--;
                        iS = 59;
                        iMil == 999;
                    }
                } else {
                    iS--;
                    iMil = 999;
                }
            } else {
                iMil-=4; // Make up for ms lost doing calculations
            }
            hours.text(iH);
            minutes.text(iMin);
            seconds.text(iS);
            if (iMil >= 10 && iMil < 100) {
                milliseconds.text('0'+iMil);
            } else if (iMil >= 0 && iMil < 10) {
                milliseconds.text('00'+iMil);
            } else if (iMil == -1) {
                milliseconds.text('000');
            } else {
                milliseconds.text(iMil);
            }
        }, 1 );

无论您使用哪个标签,都有办法运行吗?

1 个答案:

答案 0 :(得分:3)

出于电源管理的原因,当页面不在前台时,许多浏览器会减慢或停止间隔计时器。

正如我在my earlier response to you中所说的使用相同代码的另一个问题,你不应该维持自己的时间计数,因为setInterval()不是一个精确的计时器(如你所发现的)。

相反,您应该存储开始时间,然后在每个计时器刻度上获取当前时间并计算实际经过的时间。如果以这种方式执行选项卡,则不会出现任何问题,并且每次调用计时器时,您将始终显示正确的时间。

间隔计时器将是一个显示更新计时器,而不是一个跟踪准确时间的计时器。

所以,如果你想显示经过的时间,你会做这样的事情:

function startTimer() {
    var startTime = new Date().getTime();
    var timer = setInterval(function() {
        var elapsedMilliseconds = new Date().getTime() - startTime;
        // now do whatever you want with the elapsedMilliseconds

    }, 1);
}