Signatur
Beschreibung
Das change-Ereignis der IdleDetector-Schnittstelle (Idle Detection API) wird ausgelöst, wenn sich der Wert von IdleDetector.userState ("active" ↔ "idle") oder IdleDetector.screenState ("unlocked" ↔ "locked") ändert. Man registriert den Handler entweder mit addEventListener("change", handler) oder über die Eigenschaft onchange.
Das Ereignis ist ein einfaches Event ohne zusätzliche Daten. Die neuen Zustände liest man direkt am Detektor ab, meist über event.target.userState und event.target.screenState.
Typische Einsatzfälle sind Chat- und Kollaborations-Anwendungen, die einen Status wie „abwesend“ anzeigen, Kiosk-Systeme, die sich nach Inaktivität zurücksetzen, oder Anwendungen, die teure Hintergrundarbeit pausieren, wenn der Bildschirm gesperrt ist.
Wichtig: Das Ereignis wird erst ausgelöst, nachdem IdleDetector.requestPermission() den Wert "granted" geliefert hat und idleDetector.start({ threshold }) aufgerufen wurde. Der Schwellenwert threshold legt fest, nach wie vielen Millisekunden ohne Eingabe der Nutzer als "idle" gilt. Er muss mindestens 60 000 ms betragen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, immer "change". |
|
| $handler Pflicht | (event: Event) => void | Callback, der bei jeder Zustandsänderung aufgerufen wird. event.target ist der IdleDetector. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal zum späteren Entfernen. |
Beispiele
Präsenzstatus mit addEventListener überwachen
const startIdleWatch = async () => {
if (!('IdleDetector' in window)) {
console.log('Idle Detection API nicht unterstützt');
return;
}
// Berechtigung muss aus einer Nutzeraktion heraus angefragt werden
const permission = await IdleDetector.requestPermission();
if (permission !== 'granted') {
console.log('Berechtigung verweigert');
return;
}
const detector = new IdleDetector();
detector.addEventListener('change', (event) => {
const { userState, screenState } = event.target;
console.log(`Nutzer: ${userState}, Bildschirm: ${screenState}`);
});
await detector.start({ threshold: 60_000 });
console.log('IdleDetector gestartet');
};
document.querySelector('#watch').addEventListener('click', startIdleWatch);
onchange-Eigenschaft für Chat-Status
const setStatus = (text) => {
document.querySelector('#status').textContent = text;
};
const initPresence = async () => {
if ((await IdleDetector.requestPermission()) !== 'granted') return;
const detector = new IdleDetector();
detector.onchange = () => {
if (detector.screenState === 'locked') {
setStatus('Offline (Bildschirm gesperrt)');
} else if (detector.userState === 'idle') {
setStatus('Abwesend');
} else {
setStatus('Online');
}
};
await detector.start({ threshold: 5 * 60_000 });
};
document.querySelector('#enable-presence').onclick = initPresence;
Überwachung per AbortController beenden
const controller = new AbortController();
const watch = async () => {
if ((await IdleDetector.requestPermission()) !== 'granted') return;
const detector = new IdleDetector();
const onChange = () => console.log('Zustand:', detector.userState);
detector.addEventListener('change', onChange);
// start() mit signal: abort() stoppt den Detektor
await detector.start({ threshold: 60_000, signal: controller.signal });
controller.signal.addEventListener('abort', () => {
detector.removeEventListener('change', onChange);
console.log('Idle-Überwachung beendet');
});
};
document.querySelector('#start').onclick = watch;
document.querySelector('#stop').onclick = () => controller.abort();
// Wichtig · Fallstricke
- Browser-Kompatibilität: Die API ist experimentell und nur in Chromium-basierten Browsern verfügbar (Chrome/Edge/Opera ab Version 94). Firefox und Safari lehnen sie aus Datenschutzgründen ab. Vor der Nutzung sollte man deshalb immer mit
'IdleDetector' in windowprüfen, ob sie vorhanden ist. - Sicherer Kontext & Berechtigung: Die API steht nur über HTTPS zur Verfügung.
IdleDetector.requestPermission()muss durch eine Nutzeraktion (transiente Aktivierung) ausgelöst werden, sonst wird die Anfrage abgelehnt. In iframes ist zusätzlich die Permissions-Policyidle-detectionnötig. - Schwellenwert: Liegt
thresholdunter 60 000 ms, verwirftstart()das Promise mit einemTypeError. Ohne erfolgreichen Aufruf vonstart()wird nie einchange-Ereignis ausgelöst. - Keine Ereignisdaten: Das Ereignis enthält keine alten oder neuen Werte. Wer den vorherigen Zustand braucht, muss ihn selbst speichern.
- Datenschutz: Da Inaktivitätsdaten Rückschlüsse auf das Verhalten von Nutzern erlauben, sollte man klar erklären, wofür sie verwendet werden, und die Überwachung per
AbortSignalbeenden, wenn sie nicht mehr gebraucht wird.