【问题标题】:Pausing setInterval when page/ browser is out of focus当页面/浏览器失焦时暂停 setInterval
【发布时间】:2011-09-20 10:14:15
【问题描述】:

我在客户的主页上制作了一个简单的幻灯片,使用 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 有更好的建议?

谢谢

【问题讨论】:

  • 前段时间我在做一个项目时遇到了同样的问题 - 我们试图修复那个烦人的“错误”..但最后我们使用了原来的代码..因为当这种奇怪的行为发生时我们无法重现:(+1希望有人有解决方案:)

标签: javascript jquery setinterval onblur


【解决方案1】:

立即在setInterval 中,检查文档是否获得焦点。间隔将像往常一样继续触发,但里面的代码只有在文档获得焦点时才会执行。如果窗口模糊然后重新聚焦,则间隔将继续保持时间但document.hasFocus()在那段时间是false,因此浏览器不需要通过执行代码块来“赶上”焦点已恢复。

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

【讨论】:

    【解决方案2】:

    试试这样的:

    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 中完成的一些测试

    【讨论】:

    • 所以基本上添加第二个 clearInterval 以防万一?如果确实错过了 clearInterval ,这似乎是明智的。我会稍微测试一下你的想法,看看它是否解决了这个错误。
    • @MichaelWatson 添加了一些额外的代码,将其标记为“可选”。该代码可能会提供一些额外的安全性(至少它可能会阻止同时运行多个间隔)
    • 我喜欢它。让我给它一天左右的测试时间,如果愚蠢的错误仍然潜入,我会告诉你的。
    • 嘿Linus-我可以确认,它有效!没有戏剧性的过度测试,但在 ie7+、chrome、safari 和 firefox 上看起来很棒。
    • @JacobFord 您可能需要在初始化时设置间隔,将其清除为蓝色,然后再次将间隔设置为焦点。如果窗口已经处于焦点然后加载页面,则永远不会发生猜测“焦点”。抱歉回复晚了!
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多