Idle Detection API 的設計是當 App 被用戶閒置超過設定的時間時觸發,目前這個 API 還在提議的階段。
API 的相關文件: https://wicg.github.io/idle-detection/
空閒檢測可以解決什麼問題?
在有這個 API 前其實有個 visibilitychange
事件能夠達到一半的目的,瀏覽器會偵測是否還 Focus 在當前的 Tab。
document.addEventListener("visibilitychange", function () {
if (document.visibilityState === "visible") {
backgroundMusic.play();
} else {
backgroundMusic.pause();
}
});
主要是透過用戶、螢幕兩方面去偵測
enum UserIdleState {
"active",
"idle"
};
enum ScreenIdleState {
"locked",
"unlocked"
};
直接看官方的範例:
const main = async () => {
// 有就可以用
if (!("IdleDetector" in window)) {
return console.log("IdleDetector is not available.");
}
// 但還是需要先取得權限
if ((await IdleDetector.requestPermission()) !== "granted") {
return console.log("Idle detection permission not granted.");
}
try {
const controller = new AbortController();
const signal = controller.signal;
const idleDetector = new IdleDetector();
idleDetector.addEventListener("change", () => {
console.log(
`Idle change: ${idleDetector.userState}, ${idleDetector.screenState}.`
);
});
await idleDetector.start({
threshold: 60000,
signal,
});
console.log("IdleDetector is active.");
window.setTimeout(() => {
controller.abort();
console.log("IdleDetector is stopped.");
}, 120000);
} catch (err) {
// Deal with initialization errors like permission denied,
// running outside of top-level frame, etc.
console.error(err.name, err.message);
}
};
main();
這也是一個漸進式增強的實際的範例,讓 App 能夠逐步支援更多的功能。
這個頁面在勾選觸發後,只要在 60 秒不活動後就會清除繪畫的內容。這個應用案例可以想像這成被部署在公眾場合供參觀的使用者塗鴉。
Demo 連結: https://idle-detection.glitch.me/