检测浏览器选项卡是否处于活动状态或用户是否已切换

时间:2013-10-22 13:38:41

标签: javascript 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":
                $('.message').html('<div class="alert alert-error">Oops. You navigated away from the ads <a id="start" class="butt green">Resume</a></div>');

                var myDiv = $("#bar");
                myDiv.clearQueue();
                myDiv.stop();
                clearInterval($timer);
                $timer = null;
                break;
            case "focus":
                // do work
                break;
        }
    }

    $(this).data("prevType", e.type);
});

但这仅在用户最小化活动窗口时才有效。

5 个答案:

答案 0 :(得分:133)

现在我们可以使用visibility API

为了处理不同的浏览器特定语法,我制作了这个小代码:

var vis = (function(){
    var stateKey, eventKey, keys = {
        hidden: "visibilitychange",
        webkitHidden: "webkitvisibilitychange",
        mozHidden: "mozvisibilitychange",
        msHidden: "msvisibilitychange"
    };
    for (stateKey in keys) {
        if (stateKey in document) {
            eventKey = keys[stateKey];
            break;
        }
    }
    return function(c) {
        if (c) document.addEventListener(eventKey, c);
        return !document[stateKey];
    }
})();

用法:

var visible = vis(); // gives current state

vis(aFunction);      // registers a handler for visibility changes

示例:

vis(function(){
  document.title = vis() ? 'Visible' : 'Not visible';
});

Demonstration page

答案 1 :(得分:13)

这三行代码对我有用

document.addEventListener("visibilitychange", function() {
      document.title = document.hidden ? "I'm away" : "I'm here";
});
      

参考链接:document.hidden

演示:https://iamsahilralkar.github.io/document-hidden-demo/

答案 2 :(得分:2)

案例1

只需将此EventListener添加到您的构造函数中即可。

document.addEventListener("visibilitychange", function() {
      if (document.hidden) {
        //do whatever you want
        console.log("Hidden");
      }
      else {
        //do whatever you want
        console.log("SHOWN");
      }
});

案例2

请参阅此处如果您更改选项卡$(window).blur(function (),则函数将调用;如果再次来到此选项卡,则将$(window).focus(function (),函数将调用。 将此代码添加到您的构造函数中

$(window).focus(function () {
      //do something
       console.log("You are in this tab");
});

$(window).blur(function () {
      //do something
       console.log("You left this tab");
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Click here and click outside of this..</p>

答案 3 :(得分:2)

这是一个 ES6 多浏览器解决方案,我用它来确定选项卡的可见性。我从 Deny 的解决方案中汲取灵感,并根据我的需求进行了调整。

const vis = (c) => {
  let self = this
  const browserProps = {
    hidden: "visibilitychange",
    msHidden: "msvisibilitychange",
    webkitHidden: "webkitvisibilitychange",
    mozHidden: "mozvisibilitychange",
  }
  for (item in browserProps) {
    if (item in document) {
      eventKey = browserProps[item]
      break
    }
  }

  if (c) {
    if (!self._init && !(typeof document.addEventListener === "undefined")) {
      document.addEventListener(eventKey, c)
      self._init = true
      c()
    } 
  }
  return  !document[item] 
}

vis(() => {
  let tabVisibility = vis() ? 'Visible' : 'Not visible';
  console.log(tabVisibility)
})

答案 4 :(得分:0)

如果要检测用户是否对该选项卡可见,请使用DISPLAY进行检查(只读属性)。尽管document.visibilityState也可以像其他人一样写,但是W3C considers it 'historical'并建议使用前一种方法。

如果您只想知道选项卡是否为活动,请使用document.hidden进行检查。在这种情况下,该标签在其他情况下仍可能是可见,但不会处于活动状态(例如,两个并行视图浏览器窗口,其中只有一个处于活动状态,两个窗口均可见)。

如果您想捕获可见性状态的变化(在这种情况下自然是活动状态),那么请收听Page Visibility API中的document.hasFocus()事件

使用全部三个示例

visibilitychange

处理浏览器兼容性

您可以设置以下检查来覆盖不兼容的浏览器。

注意:不包括compatible all the way to IE6// Capture change to visibility document.addEventListener("visibilitychange", function() { // Check if tab content is visible if (document.visibilityState) { console.log("Tab is visible!") } // Check if tab is active if (document.hasFocus()) { console.log("Tab is active!"); } });

hasFocus()

快速MDN参考