【问题标题】:Is there any way to detect that window is currently active in IE8?有什么方法可以检测 IE8 中当前处于活动状态的窗口吗?
【发布时间】:2012-03-09 10:45:56
【问题描述】:

有什么方法可以检测到 IE8 中的窗口当前处于活动状态(显示在活动选项卡/窗口上)?

我知道有像onfocusin/onfocus 这样的事件——但这不是一个完美的解决方案,因为窗口也必须获得焦点才能触发事件——所以当用户只是切换选项卡而不接触窗口本身。

我相信对于这种普通的用例,必须有一些简单、优雅的解决方案。

【问题讨论】:

  • 最好的方法是使用 Page Visibility API。但是,此 API 在旧版浏览器中不可用。我写了一个 jQuery 插件,它使用最好的 API 来检测页面是否可见:stackoverflow.com/a/9634295/96656

标签: javascript internet-explorer-8 tabs


【解决方案1】:

我编写了一个 jQuery 插件来执行此操作:http://mths.be/visibility 它为您提供了一个非常简单的 API,允许您在页面的可见性状态更改时执行回调。

它通过使用受支持的the Page Visibility API 来实现这一点,并在旧浏览器中回退到旧的focusblur

演示: http://mathiasbynens.be/demo/jquery-visibility

此插件仅提供两个自定义事件供您使用:showhide。当页面可见性状态发生变化时,会触发相应的事件。

您可以单独使用它们:

$(document).on('show', function() {
  // the page gained visibility
});

……和……

$(document).on('hide', function() {
  // the page was hidden
});

由于大多数情况下您都需要这两个事件,因此最好的选择是使用事件地图。这样,您可以一次性绑定两个事件处理程序:

$(document).on({
  'show': function() {
    console.log('The page gained visibility; the `show` event was triggered.');
  },
  'hide': function() {
    console.log('The page lost visibility; the `hide` event was triggered.');
  }
});

插件将检测浏览器是否原生支持 Page Visibility API,并将此信息显示为 $.support.pageVisibility 中的布尔值 (true/false):

if ($.support.pageVisibility) {
  // Page Visibility is natively supported in this browser
}

【讨论】:

  • 感谢您的回答。我检查了网络,似乎页面可见性 API 包含在 IE10 中。似乎对于较旧的版本,我们必须坚持使用旧的-不是很好的模糊/焦点:)
  • 如果用户在您的页面上切换另一个程序,这也不起作用。仅适用于在选项卡之间切换。
  • 对于跨浏览器并处理使用 .blur|.focus 出现的“问题”的插件,请尝试在此处查看答案 -> Is there a way to detect if a browser window is not currently active?
  • @SpYk3HH 上述插件是跨浏览器兼容的,没有任何已知的误报。你知道我的插件有什么错误吗?如果有,请举报。
  • 我真的希望这对我的用例有用。不幸的是,mathiasbynens.be/demo/jquery-visibility 的演示仅在同一浏览器窗口中的选项卡之间切换时有效,不适用于其他浏览器窗口或其他程序。在 Windows 上的 Chrome 73.0.3683.103(官方构建)(64 位)和 Firefox 66.0.3(64 位)中得到确认。
【解决方案2】:
var isActive = false; function onBlur() { isActive = false; }; function onFocus(){ isActive = true; }; if (/*@cc_on!@*/false) { // check for Internet Explorer document.onfocusin = onFocus; document.onfocusout = onBlur; } else { window.onfocus = onFocus; window.onblur = onBlur; }

【讨论】:

    【解决方案3】:

    使用浏览器默认Page Visibility API

    function isPageHidden(){
        if (typeof(document.hidden) === 'boolean') return document.hidden;
        if (typeof(document.msHidden) === 'boolean') return document.msHidden;
        if (typeof(document.webkitHidden) === 'boolean') return document.webkitHidden;
        if (typeof(document.mozHidden) === 'boolean') return document.mozHidden;
        else return undefined;
    }
    

    【讨论】:

      【解决方案4】:
      document.addEventListener("visibilitychange", () => { 
          if (document.visibilityState === 'visible') alert("Hello again"); 
      });
      

      更多信息请参见Page Visibility API on MDN

      【讨论】:

      【解决方案5】:

      这是一个简单的task用jQuery实现:

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

      全局 isActive 变量确定选项卡/窗口是否处于活动状态。

      【讨论】:

      【解决方案6】:
      <script>
      
          // Adapted slightly from Sam Dutton
          // Set name of hidden property and visibility change event
          // since some browsers only offer vendor-prefixed support
          var hidden, state, visibilityChange; 
          if (typeof document.hidden !== "undefined") {
              hidden = "hidden";
              visibilityChange = "visibilitychange";
              state = "visibilityState";
          } else if (typeof document.mozHidden !== "undefined") {
              hidden = "mozHidden";
              visibilityChange = "mozvisibilitychange";
              state = "mozVisibilityState";
          } else if (typeof document.msHidden !== "undefined") {
              hidden = "msHidden";
              visibilityChange = "msvisibilitychange";
              state = "msVisibilityState";
          } else if (typeof document.webkitHidden !== "undefined") {
              hidden = "webkitHidden";
              visibilityChange = "webkitvisibilitychange";
              state = "webkitVisibilityState";
          }
          // Add a listener that constantly changes the title
          document.addEventListener(visibilityChange, function() {
              document.title = document[state];
          }, false);
      
          // Set the initial value
          document.title = document[state];
      
      </script>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        相关资源
        最近更新 更多