Signatur
Beschreibung
Das focus-Ereignis am Window-Objekt wird ausgelöst, sobald das Browserfenster oder der Tab den Eingabefokus erhält. Das passiert etwa, wenn der Nutzer von einer anderen Anwendung zurückwechselt, auf das Fenster klickt oder aus einem anderen Tab zurückkommt. Das Gegenstück ist das blur-Ereignis, das beim Verlust des Fokus ausgelöst wird.
Registrieren lässt es sich über window.addEventListener("focus", handler) oder über die Eigenschaft window.onfocus = handler. Der Handler erhält ein FocusEvent. Das Ereignis steigt nicht auf (bubbles: false) und lässt sich nicht abbrechen.
Typische Anwendungsfälle sind das Aktualisieren veralteter Daten, wenn der Nutzer zurückkehrt („Refetch on focus“), das Fortsetzen von Animationen oder Polling und das Zurücksetzen von Benachrichtigungszählern im Seitentitel.
Wichtig: Da focus nicht aufsteigt, landen Fokus-Ereignisse einzelner Elemente (z. B. <input>) nicht über die Bubbling-Phase beim window. Ein Listener mit capture: true am window fängt sie jedoch ab. Deshalb sollte man im Handler per event.target === window prüfen, ob wirklich das Fenster gemeint ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, hier "focus". |
|
| $handler Pflicht | (event: FocusEvent) => void | Callback, der beim Fokuserhalt des Fensters aufgerufen wird. event.target ist das window; event.relatedTarget ist in der Regel null. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie once, capture oder signal (zum Entfernen per AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein FocusEvent-Objekt.Beispiele
Daten neu laden, wenn der Nutzer zurückkehrt
const loadNotifications = async () => {
const res = await fetch('/api/notifications');
const data = await res.json();
console.log(`Neue Benachrichtigungen: ${data.length}`);
};
window.addEventListener('focus', (event) => {
// Nur reagieren, wenn das Fenster selbst den Fokus erhält
if (event.target !== window) return;
loadNotifications();
});
Seitentitel per onfocus/onblur umschalten
const originalTitle = document.title;
window.onblur = () => {
document.title = '👋 Komm zurück!';
};
window.onfocus = () => {
document.title = originalTitle;
console.log('Fenster wieder aktiv');
};
Listener mit AbortController wieder entfernen
const controller = new AbortController();
let count = 0;
const onFocus = () => {
count += 1;
console.log(`Fokus erhalten (${count}x)`);
if (count >= 3) {
controller.abort(); // entfernt den Listener
console.log('Listener entfernt');
}
};
window.addEventListener('focus', onFocus, { signal: controller.signal });
// Alternativ klassisch:
// window.removeEventListener('focus', onFocus);
// Wichtig · Fallstricke
- Kein Bubbling:
focussteigt nicht auf. Wer Fokuswechsel von Elementen zentral beobachten will, nimmtfocusinoder registriert den Listener mitcapture: true. Im Capture-Modus löst der Handler dann aber auch bei Element-Fokus aus, daherevent.target === windowprüfen. - Nicht gleichbedeutend mit Sichtbarkeit: Ein Fenster kann sichtbar sein, ohne den Fokus zu haben (z. B. zwei Fenster nebeneinander, oder der Fokus liegt in einem
<iframe>). Ob der Tab sichtbar ist, erkennt man zuverlässiger mitvisibilitychangeunddocument.visibilityState. - iframes: Klickt der Nutzer in ein eingebettetes
<iframe>, löst das übergeordnete Fensterbluraus. Beim Zurückklicken folgt wiederfocus. - Entwicklerwerkzeuge: Klicks in die DevTools lösen ebenfalls
blur/focusaus. Das kann beim Debuggen verwirren. - Den aktuellen Zustand liefert
document.hasFocus(), zum Beispiel beim Laden der Seite, bevor überhaupt ein Ereignis eingetroffen ist. - Kompatibilität: wird seit Langem von allen Browsern unterstützt. Auf Mobilgeräten ist das Verhalten beim Tab- oder App-Wechsel aber nicht einheitlich; dort ist
visibilitychangerobuster.