用于检测用户是否更改选项卡的Javascript

Max*_*eel 37 html javascript


我想写一个网页进行在线测验.我的基本要求是,如果参加测验的人改变标签或打开新窗口,即使没有最小化浏览器,即如果该人试图从其他窗口/标签看到答案,测验应该停下来.我怎么能这样做?
PS:它不应该是一些非常新的HTML5功能.我希望目前所有主流浏览器都支持它.

Kri*_*ian 51

您可以通过将模糊/焦点事件侦听器附加到窗口来确定选项卡或窗口是否处于活动状态.

在jQuery中它会是

$(window).focus(function() {
    //do something
});

$(window).blur(function() {
    //do something
});
Run Code Online (Sandbox Code Playgroud)

引用这个SO答案:https://stackoverflow.com/a/1760268/680578

  • 单击该页面中的iframe时,您也会收到误报. (4认同)
  • 也会因为失去对窗户的焦点而开火,但窗口仍然可见. (3认同)
  • 它是否能够检测用户是否启动新窗口/浏览器而不最小化测验窗口? (2认同)

小智 31

2020 年,您可以:

document.addEventListener("visibilitychange", event => {
  if (document.visibilityState == "visible") {
    console.log("tab is active")
  } else {
    console.log("tab is inactive")
  }
})
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 25

如果您的目标是支持它的浏览器,则可以使用HTML5中提供的Page Visibility API.它不会直接检测标签更改,但是可见性会发生变化.其中包括(但不限于)标签更改.

请参阅https://developer.mozilla.org/en/DOM/Using_the_Page_Visibility_API


ptt*_*tts 17

最好的原生功能,没有jQuery.

document.hasFocus
Run Code Online (Sandbox Code Playgroud)

检查笔,检查当您转到链接并返回到codepen选项卡时会发生什么.

https://codepen.io/damianocel/pen/Yxxzdj

  • 该演示每 200 毫秒检查一次可见性,在电池使用方面并不理想。Visibility API 是基于事件的,适用于 IE10 甚至移动设备,因此我强烈建议您使用它。 (4认同)
  • 似乎在 Opera、FireFox、Safari 和 Chrome 中对我有用。没有在其他地方测试过。 (2认同)

shi*_*or7 8

窗口onfocus并且onblur工作正常:

window.onfocus = function (ev) {
    console.log("gained focus");
};

window.onblur = function (ev) {
    console.log("lost focus");
};
Run Code Online (Sandbox Code Playgroud)


472*_*084 5

使用 jQuery:

$(window).on('focus', function () {

});

$(window).on('blur', function () {

});
Run Code Online (Sandbox Code Playgroud)

$().focus&$().blur已弃用。