如何使用 Javascript 在 Chrome 中检测标签是否处于焦点状态?

IT技术 javascript google-chrome focus
2021-02-04 08:08:56

我需要知道用户当前是否正在 Google Chrome 中查看标签页。我尝试使用绑定到窗口的事件模糊和焦点,但似乎只有模糊才能正常工作。

window.addEventListener('focus', function() {
  document.title = 'focused';
});

window.addEventListener('blur', function() {
  document.title = 'not focused';
});

焦点事件很奇怪,只是有时。如果我切换到另一个选项卡并返回,则不会激活焦点事件。但是如果我点击地址栏然后返回页面,它会。或者,如果我切换到另一个程序,然后返回到 Chrome,它会在选项卡当前处于焦点状态时激活。

6个回答

2015 年更新:具有可见性 API 的新 HTML5 方式(取自 Blowsie 的评论):

document.addEventListener('visibilitychange', function(){
    document.title = document.hidden; // change tab text for demo
})

截至 2011 年,原始海报提供的代码(在问题中)现在有效:

window.addEventListener('focus', function() {
    document.title = 'focused';
});

window.addEventListener('blur', function() {
    document.title = 'not focused';
});

编辑:几个月后在 Chrome 14 中,这仍然有效,但用户必须至少通过单击窗口中的任意位置一次与页面交互。仅仅滚动等不足以完成这项工作。这样window.focus()做也不会使这项工作自动进行。如果有人知道解决方法,请提及。

函数 iframeMouse(over) { oif = over; } window.addEventListener('blur', function() { document.title = oif ? "iframe focus" : "notfocused"; });
2021-03-18 08:08:56
无需用户首先单击某处即可使其工作的方法是将“window.focus()”添加到 window.onload 事件。这样做的副作用是,如果窗口是链接的目标并且已经在当前窗口后面打开,它将被带到前面。请注意,此解决方案仅检测失去焦点,而不是由切换选项卡引起的。例如,如果失去焦点是由于用户在 iframe 内单击而引起的,则必须消除这种情况:
2021-03-19 08:08:56
有关更深入的可靠答案,请参阅this。forums.greensock.com/topic/...
2021-03-21 08:08:56
<iframe ... onmouseover="iframeMouse(true)" onmouseout="iframeMouse(false)"></iframe>
2021-03-29 08:08:56
使用document.visibilityState来获得当前可见性状态
2021-04-13 08:08:56

问题的选定答案有没有办法检测浏览器窗口当前是否处于活动状态?应该管用。它利用了W3C 于 2011-06-02 起草Page Visibility API

毕竟它可能会起作用,我很好奇并写了以下代码:

...
setInterval ( updateSize, 500 );
function updateSize(){
  if(window.outerHeight == window.innerHeight){
    document.title = 'not focused';             
  } else {
    document.title = 'focused';
  }

  document.getElementById("arthur").innerHTML = window.outerHeight + " - " + window.innerHeight;
}
...
<div id="arthur">
  dent
</div>

这段代码正是你想要的,但方式很丑陋。问题是,Chrome 似乎不时忽略标题更改(切换到选项卡并按住鼠标 1 秒时似乎总是会产生这种效果)。

您将在屏幕上看到不同的值,但您的标题不会改变。

结论:无论你在做什么,测试时不要相信结果!

无论如何,感谢 (window.outerHeight == window.innerHeight) 部分。对于这个特定的项目,我只需要知道用户当前是否专注。无需经常检查,您的代码就可以工作。
2021-03-19 08:08:56
标题对我来说立即改变。如果我将事件更改为 mouseover 和 mouseout,我会立即得到结果。
2021-03-24 08:08:56

对于想要在模糊上交换页面标题然后在焦点上返回原始页面标题的任何人:

// Swapping page titles on blur
var originalPageTitle = document.title;

window.addEventListener('blur', function(){
    document.title = 'Don\'t forget to read this...';
});

window.addEventListener('focus', function(){
    document.title = originalPageTitle;
});

我发现将 onblur= 和 onfocus= 事件添加到内联绕过了这个问题: