如何判断浏览器/选项卡是否处于活动状态

ckk*_*ght 323 javascript jquery

可能重复:
有没有办法检测浏览器窗口当前是否处于活动状态?

我有一个每秒调用的函数,如果当前页面在前台,我只想运行,即用户没有最小化浏览器或切换到另一个选项卡.如果用户没有看到它并且可能是CPU密集型的话,它没有用处,所以我不想在后台浪费周期.

有谁知道如何在JavaScript中讲述这个?

注意:我使用jQuery,所以如果你的答案使用它,那很好:).

Ric*_*ões 324

您将使用窗口的focusblur事件:

var interval_id;
$(window).focus(function() {
    if (!interval_id)
        interval_id = setInterval(hard_work, 1000);
});

$(window).blur(function() {
    clearInterval(interval_id);
    interval_id = 0;
});
Run Code Online (Sandbox Code Playgroud)

回答"双火"的评论问题并保持jQuery的易用性:

$(window).on("blur focus", function(e) {
    var prevType = $(this).data("prevType");

    if (prevType != e.type) {   //  reduce double fire issues
        switch (e.type) {
            case "blur":
                // do work
                break;
            case "focus":
                // do work
                break;
        }
    }

    $(this).data("prevType", e.type);
})
Run Code Online (Sandbox Code Playgroud)

单击以查看示例代码显示它正常工作(JSFiddle)

  • 这个答案不是最佳的,因为对于用户采取的每个概念性焦点或模糊动作,"焦点"和"模糊"事件通常可以在浏览器中触发一次以上,在这种情况下,客户端将开始执行"hard_work"以上操作一个间隔,基本上同时. (7认同)
  • 我在别处读过"onmousemove"可能是"焦点"的可行替代品. (3认同)

gea*_*tal 286

除了RichardSimões的回答,您还可以使用Page Visibility API.

if (!document.hidden) {
    // do what you need
}
Run Code Online (Sandbox Code Playgroud)

此规范定义了一种方法,供站点开发人员以编程方式确定页面的当前可见性状态,以便开发功能和CPU高效的Web应用程序.

学到更多

  • +1给出一个不依赖于jQuery的答案.从长远来看,这似乎也是最好的答案,因为浏览器正朝着支持W3C标准迈进.David Walsh的例子适用于Chrome和Firefox,但不适用于Safari. (20认同)
  • @ckknight 你介意改变这个公认的答案吗?这个更新的答案是我们应该在 2019 年使用的答案 (6认同)
  • 页面可见性API检测浏览器是否可见,例如未最小化或完全被另一个窗口覆盖.它不会检测窗口可见但另一个窗口处于活动状态的情况. (4认同)
  • 可见性和焦点是完全不同的东西. (3认同)
  • 仅供参考:http://caniuse.com/#search=Page%20Visibility (2认同)
  • “页面可见性级别 2 取代了‘[PAGE-VISIBILITY]’的第一个版本,并包括:……‘Document.hidden’是历史性的。**使用 `Document.visibilityState` 来代替。**” (2认同)
  • @КонстантинВан 只有 W3C 可以创建一个草案,其中的建议**会失效并被同一草案中的另一个建议取代**。 (2认同)

CMS*_*CMS 136

我会尝试在window.onfocuswindow.onblur事件上设置一个标志.

以下代码段已在Firefox,Safari和Chrome上进行了测试,打开控制台并来回切换标签:

var isTabActive;

window.onfocus = function () { 
  isTabActive = true; 
}; 

window.onblur = function () { 
  isTabActive = false; 
}; 

// test
setInterval(function () { 
  console.log(window.isTabActive ? 'active' : 'inactive'); 
}, 1000);
Run Code Online (Sandbox Code Playgroud)

在这里尝试一下.

  • 实际上,它在Chrome上总是错误的原因是因为`console.log`使用`window.isActive`.删除`window`部分或将其添加到任何地方.我也认为`isActive`应该初始化为真,以获得更好的结果. (6认同)

Chr*_*tow 17

使用jQuery:

$(function() {
    window.isActive = true;
    $(window).focus(function() { this.isActive = true; });
    $(window).blur(function() { this.isActive = false; });
    showIsActive();
});

function showIsActive()
{
    console.log(window.isActive)
    window.setTimeout("showIsActive()", 2000);
}

function doWork()
{
    if (window.isActive) { /* do CPU-intensive stuff */}
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*inn 7

这里的所有示例(rockacola除外)都要求用户在物理上单击窗口以定义焦点.这不是理想的,所以.hover()更好的选择:

$(window).hover(function(event) {
    if (event.fromElement) {
        console.log("inactive");
    } else {
        console.log("active");
    }
});
Run Code Online (Sandbox Code Playgroud)

这将告诉您用户何时将鼠标放在屏幕上,但它仍然不会告诉您它是否在用户鼠标位于其他位置的前景中.

  • 在盒子外思考; 但是,如果您试图弄清楚用户在页面上停留多长时间,它将无法正常工作.此外,`hover`不是移动浏览器的有效选项.为了公平起见,我不知道`focus`或`blur`事件绑定是否适用于移动设备. (2认同)

Tra*_*v L 6

如果您在Chrome中打开时尝试执行类似于Google搜索页面的操作,(当您"关注"页面时会触发某些事件),则hover()事件可能有所帮助.

$(window).hover(function() {
  // code here...
});
Run Code Online (Sandbox Code Playgroud)