可能是重复问题:
有没有办法检测浏览器窗口当前是否处于活动状态?
我有一个函数,每秒钟都会被调用,但我只想在当前页面处于前台时运行它,即用户没有将浏览器最小化或切换到另一个标签页。如果用户没有看着它,那么它就没有任何意义,并且可能会占用大量 CPU 资源,因此我不想在后台浪费周期。
有人知道如何在 JavaScript 中判断这一点吗?
注意:我使用 jQuery,所以如果你的答案使用了它,那就没问题 :)。
可能是重复问题:
有没有办法检测浏览器窗口当前是否处于活动状态?
我有一个函数,每秒钟都会被调用,但我只想在当前页面处于前台时运行它,即用户没有将浏览器最小化或切换到另一个标签页。如果用户没有看着它,那么它就没有任何意义,并且可能会占用大量 CPU 资源,因此我不想在后台浪费周期。
有人知道如何在 JavaScript 中判断这一点吗?
注意:我使用 jQuery,所以如果你的答案使用了它,那就没问题 :)。
除了Richard Simões的答案之外,您还可以使用页面可见性API。
if (!document.hidden) {
// do what you need
}
这个规范定义了一种方法,让站点开发人员可以编程地确定页面的当前可见状态,以便开发功能强大、CPU高效的Web应用程序。您需要使用窗口的focus
和blur
事件:
var interval_id;
$(window).focus(function() {
if (!interval_id)
interval_id = setInterval(hard_work, 1000);
});
$(window).blur(function() {
clearInterval(interval_id);
interval_id = 0;
});
回答有关“双击触发”问题的评论,并在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":
// do work
break;
case "focus":
// do work
break;
}
}
$(this).data("prevType", e.type);
})
点击查看示例代码展示(JSFiddle)
focus
和 blur
事件经常会多次触发,此时客户端将会在多个时间间隔上开始执行 hard_work
,基本上是同时进行的。 - Jon zonmousemove
可以作为 focus
的替代方法。 - Michael Robinson$(window)focus/blur
之前呢?根据您的使用情况,这可能会破坏回调状态和任何后台作业。 (例如,如果您在页面加载时启动后台作业-但是blur
从未发生,因为用户在注册$(window).blur
之前切换了选项卡?) - KajMagnus我会尝试在 window.onfocus
和 window.onblur
事件上设置一个标志。
以下代码片段已在 Firefox、Safari 和 Chrome 上进行了测试,请打开控制台并在选项卡之间来回移动:
var isTabActive;
window.onfocus = function () {
isTabActive = true;
};
window.onblur = function () {
isTabActive = false;
};
// test
setInterval(function () {
console.log(window.isTabActive ? 'active' : 'inactive');
}, 1000);
在这里尝试一下。
console.log
使用了 window.isActive
。删掉 window.
或者在每个地方都加上它。我认为应该将 isActive
初始化为 true 以获得更好的结果。 - Bjørn Stenfeldt使用jQuery:
$(function() {
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });
showIsActive();
});
function showIsActive()
{
console.log(window.isActive)
window.setTimeout("showIsActive()", 2000);
}
function doWork()
{
if (window.isActive) { /* do CPU-intensive stuff */}
}
除了rockacola的例子,这里所有的示例都要求用户在窗口上物理点击以定义焦点。这不是理想的选择,所以.hover()
更好:
$(window).hover(function(event) {
if (event.fromElement) {
console.log("inactive");
} else {
console.log("active");
}
});
这将告诉你用户何时在屏幕上移动鼠标,但仍无法告诉你是否在前台而用户的鼠标在其他地方。
$(window).hover(function() {
// code here...
});
document.addEventListener("visibilitychange", onchange);
语句,参见 https://dev59.com/d3NA5IYBdhLWcg3wL6sc#1060034 和 https://www.w3.org/TR/page-visibility/。 - Avatar