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

2022-08-29 22:33:36

我有JavaScript定期做活动。当用户不查看网站时(即窗口或选项卡没有焦点),最好不要运行。

有没有办法使用JavaScript来做到这一点?

我的参考点:如果您使用的窗口未处于活动状态,Gmail聊天会播放声音。


答案 1

自从最初编写此答案以来,由于W3C,新规范已达到推荐状态。页面可见性API(在MDN上)现在允许我们更准确地检测页面何时对用户隐藏。

document.addEventListener("visibilitychange", onchange);

当前浏览器支持:

  • 铬 13+
  • 互联网浏览器 10+
  • 火狐 10+
  • 歌剧 12.10+ [阅读笔记]

以下代码回退到不兼容浏览器中不太可靠的模糊/对焦方法:

(function() {
  var hidden = "hidden";

  // Standards:
  if (hidden in document)
    document.addEventListener("visibilitychange", onchange);
  else if ((hidden = "mozHidden") in document)
    document.addEventListener("mozvisibilitychange", onchange);
  else if ((hidden = "webkitHidden") in document)
    document.addEventListener("webkitvisibilitychange", onchange);
  else if ((hidden = "msHidden") in document)
    document.addEventListener("msvisibilitychange", onchange);
  // IE 9 and lower:
  else if ("onfocusin" in document)
    document.onfocusin = document.onfocusout = onchange;
  // All others:
  else
    window.onpageshow = window.onpagehide
    = window.onfocus = window.onblur = onchange;

  function onchange (evt) {
    var v = "visible", h = "hidden",
        evtMap = {
          focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
        };

    evt = evt || window.event;
    if (evt.type in evtMap)
      document.body.className = evtMap[evt.type];
    else
      document.body.className = this[hidden] ? "hidden" : "visible";
  }

  // set the initial state (but only if browser supports the Page Visibility API)
  if( document[hidden] !== undefined )
    onchange({type: document[hidden] ? "blur" : "focus"});
})();

onfocusin并且对于 IE 9 及更低版本是必需的,而所有其他 IE 都使用 和 ,但 iOS 除外,它使用 和 。onfocusoutonfocusonbluronpageshowonpagehide


答案 2

我会使用jQuery,因为这样你所要做的就是:

$(window).blur(function(){
  //your code here
});
$(window).focus(function(){
  //your code
});

或者至少它对我有用。