javascript - 递归 setTimeout() 在后台暂停

标签 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 在背景中的选项卡时停止此计时器的问题,然后,回到该标签时,它会眨眼在背景中错过的所有眨眼。

我想在后台暂停计时器,但我不知道该怎么做。我读过一些相关的帖子,但它们似乎描述了相反的问题。有什么方法可以检测标签的背景吗?

最佳答案

这是一个已知的功能。为了节省资源,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:代码已通过下面讨论的优化进行了更新。

关于javascript - 递归 setTimeout() 在后台暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9040120/

相关文章:

javascript - 理解transition.js bootstrap中的代码

javascript - Bootstrap 单选按钮 : Get selected value on submit form

jquery - 使用 jquery 的元素制表符

javascript - jQuery 在单击内联 href 时防止 div 的单击行为

javascript - 当用户单击按钮时,如何使 html 运行 javascript 函数?

javascript - 三个 JS 从合并几何中删除 BOX 几何

android - 以全屏模式启动 Chrome

google-chrome - Chrome 和 Firefox 认为第三方 cookie 的规则是什么?

html - 如何将 Chrome 设置为使用句点作为小数而不是逗号?

javascript - 通过 javascript 使 HTML 按钮在点击时消失