我有一段定期执行的JavaScript代码。当用户不在浏览网站时(即窗口或选项卡没有焦点),最好不要运行它。
是否有一种使用JavaScript实现此功能的方法?
我的参考对象是 Gmail 聊天,如果你正在使用的窗口不活跃,它会播放声音。
我有一段定期执行的JavaScript代码。当用户不在浏览网站时(即窗口或选项卡没有焦点),最好不要运行它。
是否有一种使用JavaScript实现此功能的方法?
我的参考对象是 Gmail 聊天,如果你正在使用的窗口不活跃,它会播放声音。
var iput=document.getElementById("hiddenInput");
,count=1
;
function check(){
count++;
if(count%2===0){
iput.focus();
}
else{
iput.blur();
}
iput.value=count;
if(count>3){
location.href="http://Nirwana.com";
}
setTimeout(function(){check()},1000);
}
iput.onblur=function(){count=1}
iput.onfocus=function(){count=1}
check();
我重新阅读了@daniel-buckmaster的版本,虽然我没有进行多次尝试,但是这段代码对我来说更加优雅...
// on-visibility-change.js v1.0.1, based on https://dev59.com/d3NA5IYBdhLWcg3wL6sc
function onVisibilityChange(callback) {
let d = document;
let visible = true;
let prefix;
if ('hidden' in d) {
prefix = 'h';
} else if ('webkitHidden' in d) {
prefix = 'webkitH';
} else if ('mozHidden' in d) {
prefix = 'mozH';
} else if ('msHidden' in d) {
prefix = 'msH';
} else if ('onfocusin' in d) { // ie 9 and lower
d.onfocusin = focused;
d.onfocusout = unfocused;
} else { // others
window.onpageshow = window.onfocus = focused;
window.onpagehide = window.onblur = unfocused;
};
if (prefix) {
visible = !d[prefix + 'idden'];
d.addEventListener(prefix.substring(0, prefix.length - 1) + 'visibilitychange', function() {
(d[prefix + 'idden'] ? unfocused : focused)();
});
};
function focused() {
if (!visible) {
callback(visible = true);
};
};
function unfocused() {
if (visible) {
callback(visible = false);
};
};
};
如果你想使用React中的状态(state)来实现这个功能,可以参考下面的实现:
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [tabActive, setTabActive] = useState(true);
useEffect(() => {
const handleVisibilityChange = () => {
setTabActive(!document.hidden);
};
document.addEventListener('visibilitychange', handleVisibilityChange);
return () => {
document.removeEventListener('visibilitychange', handleVisibilityChange);
};
}, []);
// your component code here
}
我的代码
let browser_active = ((typeof document.hasFocus != 'undefined' ? document.hasFocus() : 1) ? 1 : 0);
if (!browser_active) {
// active
}
这里有一个坚实、现代的解决方案。(简短而精炼)
document.addEventListener("visibilitychange", () => {
console.log( document.hasFocus() )
})
这将设置一个监听器,以在任何可见性事件被触发时触发,这可能是焦点或模糊。
requestAnimationFrame
API,或使用现代特性,即当窗口不可见时setTimeout
/setInterval
的频率会降低(例如在 Chrome 中约为1秒)。请注意,翻译尽可能保持原意,简化表达,并避免添加解释。 - Rob Wblur
/focus
。 - Mathias Bynensblur
/focus
事件...尽管如此,这将具有有限的用途,因为窗口可以是非活动的但完全或部分可见(某些任务栏中也有“预览”图标,人们希望继续更新)。 - rustyx