Javascript停止标签交换

Javascript stops on tab swap

本文关键字:交换 标签 Javascript      更新时间:2023-09-26

我已经写了一个jQuery插件,一切都很好,除了脚本暂停当你切换到不同的选项卡。脚本的主体是一个延迟1ms的setInterval()

    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 );

是否有一种方法来运行这个,不管你在哪个选项卡上?

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

正如我在之前对您使用相同代码的另一个问题的回答中所说的,您不应该维护自己的时间计数,因为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);
}