Signatur
Beschreibung
Das Interface UserActivation beschreibt den Aktivierungszustand durch den Benutzer in einem Fenster. Man greift darüber auf navigator.userActivation zu, einen eigenen Konstruktor gibt es nicht. Browser erlauben viele sensible APIs nur, wenn eine echte Benutzeraktion vorliegt, etwa Pop-ups (window.open()), den Vollbildmodus, navigator.clipboard.write(), Audio-Autoplay oder navigator.vibrate().
Das Interface hat zwei schreibgeschützte Eigenschaften vom Typ Boolean:
hasBeenActive: Sticky-Aktivierung. Isttrue, sobald der Benutzer seit dem Laden der Seite mindestens einmal interagiert hat, und bleibt danachtrue.isActive: Transiente Aktivierung. Ist nur kurz nach einer aktivierenden Aktiontrue, z. B. nachkeydown,mousedown,pointerdownoderpointerupbei Maus undtouchend. Nach einem vom Browser festgelegten Zeitfenster von einigen Sekunden erlischt sie wieder. Manche APIs „verbrauchen“ sie auch sofort, z. B.window.open().
Typische Anwendungsfälle: Vor dem Aufruf einer eingeschränkten API prüfen, ob sie überhaupt klappen kann. Die Oberfläche anpassen, etwa einen Hinweis „Klicken zum Aktivieren des Tons“ anzeigen. Oder in Code prüfen, der später läuft (Timer, Nachrichten von einem iframe), ob die auslösende Benutzeraktion noch gilt.
Rückgabewert
navigator.userActivation. Das Objekt ist live, seine Eigenschaften zeigen immer den aktuellen Zustand.Beispiele
Zugriff auf das Objekt und Auslesen des Zustands
const activation = navigator.userActivation;
console.log(activation instanceof UserActivation);
console.log('Schon einmal aktiv:', activation.hasBeenActive);
console.log('Gerade aktiv:', activation.isActive);
Autoplay-Hinweis nur ohne bisherige Interaktion anzeigen
const video = document.querySelector('video');
const hint = document.querySelector('#sound-hint');
const startWithSound = async () => {
if (navigator.userActivation?.hasBeenActive) {
video.muted = false;
await video.play();
hint.hidden = true;
} else {
// Ohne Interaktion nur stumm abspielen
video.muted = true;
await video.play();
hint.hidden = false;
}
};
startWithSound();
document.addEventListener('pointerdown', startWithSound, { once: true });
Pop-up nur bei gültiger transienter Aktivierung öffnen
const button = document.querySelector('#share');
button.addEventListener('click', async () => {
const data = await fetch('/api/share-url').then((r) => r.json());
// Nach dem await kann die transiente Aktivierung abgelaufen sein
if (navigator.userActivation.isActive) {
window.open(data.url, '_blank', 'width=600,height=400');
} else {
console.warn('Aktivierung abgelaufen – Link stattdessen anzeigen');
document.querySelector('#fallback-link').href = data.url;
}
});
Aktivierungszustand an ein iframe weitergeben
// Im übergeordneten Dokument
const frame = document.querySelector('iframe');
document.addEventListener('keydown', () => {
frame.contentWindow.postMessage(
{ type: 'ping' },
{ targetOrigin: 'https://widget.example', includeUserActivation: true }
);
});
// Im iframe (nur Chromium: includeUserActivation)
window.addEventListener('message', (event) => {
console.log('Aktivierung beim Absender:', event.userActivation?.isActive);
});
// Wichtig · Fallstricke
- Nur lesbar: Eine Aktivierung lässt sich nicht künstlich erzeugen. Mit
element.click()oderdispatchEvent()erzeugte Ereignisse lösen keine Aktivierung aus, weilisTrusteddannfalseist. - Zeitfenster:
isActivegilt nur für eine vom Browser festgelegte kurze Zeit, in Chromium etwa 5 Sekunden. Langeawait-Ketten, z. B. mitfetch, können sie ablaufen lassen. Rufe eingeschränkte APIs darum möglichst synchron im Event-Handler auf. - Verbrauch: APIs wie
window.open()oderPaymentRequest.show()verbrauchen die transiente Aktivierung. Danach istisActivesofortfalse. - Nicht jedes Ereignis zählt:
mousemove,scroll,wheeloder die Escape-Taste lösen keine Aktivierung aus. - Kompatibilität:
navigator.userActivationist erst seit Firefox 120 und Safari 16.4 verfügbar. In älteren Browsern ist der Wertundefined, deshalb mit optionaler Verkettung (?.) prüfen. Die OptionincludeUserActivationundMessageEvent.userActivationsind nicht standardisiert und gibt es nur in Chromium. - Die Aktivierung gilt für ein Fenster. Innerhalb eines Frame-Baums wird sie an übergeordnete Frames weitergegeben, bei gleichem Ursprung auch an untergeordnete Frames, aber nie an Frames desselben Ursprungs außerhalb der Kette.