递归setTimeout()在背景上暂停

时间:2012-01-27 21:10:38

标签: javascript jquery google-chrome settimeout

我有一段代码:

var logo = $("#blinking-logo");
function logo_blink() {
    logo.fadeOut(10).delay(10)
        .fadeIn(10).delay(20)
            .fadeOut(10).delay(10)
            .fadeIn(10)
    window.setTimeout(logo_blink, (Math.random()*(1500))+1500);
}
logo_blink();

所有这一切都是在~30秒内闪烁一次图片(这里的时间较少,以便于调试)

当标签处于背景状态时Chrome会暂停此计时器的问题,然后,当返回该标签时,它会闪烁背景中错过的所有闪烁。

我想在后台暂停计时器,但我不知道怎么做。我已经阅读了一些相关的帖子,但似乎他们描述了相反的问题。有没有办法检测选项卡的背景?

2 个答案:

答案 0 :(得分:3)

这是一项众所周知的功能。为了节省资源,Chrome不会在没有焦点的情况下更新窗口:)例如,您可以检查该窗口是否失去焦点并停止计时器。当窗口处于焦点时再次启动它。例如:

var timer = null;
var logo = $("#blinking-logo");
function logo_blink() {
    if(timer) clearTimeout('timer');
    logo.fadeOut(10).delay(10)
        .fadeIn(10).delay(20)
            .fadeOut(10).delay(10)
            .fadeIn(10)
    timer = window.setTimeout(logo_blink, (Math.random()*(1500))+1500);
}
logo_blink();
$(window).blur(function(){clearTimeout(timer); timer = null;});
$(window).focus(function(){if (!timer) timer = window.setTimeout(logo_blink, (Math.random()*(1500))+1500);});

像这样的东西。在我的一个带有动画的页面上,setInterval遇到了同样的问题,所以我只是在页面处于后台时暂停它。

if (!$.browser.msie)
{
    $(window).focus(function(){paused = false;});
    $(window).blur(function(){paused = true;});
}

而不是基于暂停标志的值跳过动画。

ps:使用下面讨论的优化更新代码。

答案 1 :(得分:3)

Chrome,Firefox和IE10都有页面可见性API,可用于确定页面何时不再可见。在某些情况下,这比使用焦点效果更好。以下是MDN的一个例子:

//startSimulation and pauseSimulation defined elsewhere
function handleVisibilityChange() {
    if (document.hidden) {
        pauseSimulation();
    } else  {
       startSimulation();
    }
}
document.addEventListener("visibilitychange", handleVisibilityChange, false);

并且,一些参考文件:

http://code.google.com/chrome/whitepapers/pagevisibility.html

https://developer.mozilla.org/en/DOM/Using_the_Page_Visibility_API

W3文件:http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html

我在旧浏览器中看到的唯一解决方法涉及确定您的窗口是否具有焦点,这不是完美的,但在某些情况下可能比没有更好。