页面/浏览器失焦时暂停setInterval

时间:2011-09-20 10:14:16

标签: javascript jquery setinterval onblur

我在客户的主页上制作了一个简单的幻灯片,使用setInterval来计算轮换时间。

为防止浏览器在页面未对焦(正在查看另一个标签或其他程序)时搞砸setInterval,我正在使用:

function onBlur() {
            clearInterval(play);
        };

        function onFocus() {

            mySlideRotateFunction();

        };

        if (/*@cc_on!@*/false) { 
            document.onfocusin = onFocus;
            document.onfocusout = onBlur;
        } else {
            window.onfocus = onFocus;
            window.onblur = onBlur;
        }

mySlideRotateFunction设置setInterval并运行一些jQuery。虽然这在大多数情况下是有效的,但我发现,有时看起来似乎onBlur还没有运行,当我回到页面时,时间已经“积累”并且旋转变得疯狂。

我无法确定为什么有时会发生这种情况的原因,而不是其他原因。

我的问题 - 我的代码存在问题,当浏览器窗口失焦时,是否有人更好地建议“暂停”setInterval?

由于

2 个答案:

答案 0 :(得分:17)

尝试这样的事情:

var myInterval;
var interval_delay = 500;
var is_interval_running = false; //Optional

$(document).ready(function () {
    $(window).focus(function () {
        clearInterval(myInterval); // Clearing interval if for some reason it has not been cleared yet
        if  (!is_interval_running) //Optional
            myInterval = setInterval(interval_function, interval_delay);
    }).blur(function () {
        clearInterval(myInterval); // Clearing interval on window blur
        is_interval_running = false; //Optional
    });
});

interval_function = function () {
     is_interval_running = true; //Optional
     // Code running while window is in focus
}

在IE9和FF6中进行了一些测试

答案 1 :(得分:8)

立即在setInterval内,检查文档是否已对焦。间隔将像往常一样继续触发,但内部代码只有在文档被聚焦时才会执行。如果窗口模糊并稍后重新聚焦,则间隔将持续保持时间,但在此期间document.hasFocus()false,因此浏览器无需赶上"赶上& #34;通过在恢复焦点时执行代码块很多次。

var timePerInterval = 7000;
$(document).ready(function() {
    setInterval(function(){
        if ( document.hasFocus() ) {
            // code to be run every 7 seconds, but only when tab is focused
        }
    }, timePerInterval );
});