Funktionen, die von der Nutzeraktivierung abhängig sind
Um sicherzustellen, dass Anwendungen keine APIs missbrauchen können, die bei unerwünschtem Verhalten eine schlechte Benutzererfahrung schaffen, können einige APIs nur verwendet werden, wenn sich der Benutzer in einem "aktiven Interaktionszustand" befindet. Das bedeutet, dass der Benutzer derzeit mit der Webseite interagiert oder mindestens einmal mit der Seite interagiert hat. Browser beschränken den Zugriff auf sensible APIs wie Pop-ups, Vollbildmodus oder Vibrations-APIs auf aktive Benutzerinteraktionen, um zu verhindern, dass bösartige Skripte diese Funktionen missbrauchen. Diese Seite listet Funktionen der Webplattform auf, die nur nach Nutzeraktivierung verfügbar sind.
Eine Nutzeraktivierung impliziert entweder, dass der Benutzer gerade mit der Seite interagiert, oder dass seit dem Laden der Seite eine Interaktion erfolgt ist. Typischerweise ist dies ein Klick auf einen Button oder eine andere Benutzerinteraktion mit der Benutzeroberfläche.
Genauer gesagt ist ein Aktivierungsauslösendes Eingabeereignis ein Ereignis, das:
- das Attribut
isTrusted
auftrue
gesetzt hat, und - ein Ereignis der folgenden Typen ist:
keydown
(ausgenommen die Esc-Taste oder eine vom User-Agent reservierte Tastenkombination)mousedown
pointerdown
(wennpointerType
"mouse" ist)pointerup
(wennpointerType
nicht "mouse" ist)touchend
Wenn eine Aktivierung ausgelöst wurde, unterscheidet der User-Agent zwischen zwei Arten von Fensterzuständen der Nutzeraktivierung: Sticky und Transient.
Transiente Aktivierung
Transiente Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer kürzlich einen Button gedrückt, eine Maus bewegt, ein Menü verwendet oder eine andere Nutzerinteraktion durchgeführt hat. Transiente Aktivierung erlischt nach einem Timeout (falls sie nicht durch weitere Interaktion erneuert wird) und kann auch von einigen APIs verbraucht werden (wie Window.open()
).
APIs, die eine transiente Aktivierung erfordern (Liste ist nicht abschließend):
Clients.openWindow()
Clipboard.read()
Clipboard.readText()
Clipboard.write()
Clipboard.writeText()
ContactsManager.select()
Document.requestStorageAccess()
DocumentPictureInPicture.requestWindow()
Element.requestFullScreen()
Element.requestPointerLock()
EyeDropper.open()
HID.requestDevice()
HTMLInputElement.showPicker()
HTMLSelectElement.showPicker()
HTMLVideoElement.requestPictureInPicture()
IdleDetector.requestPermission()
Keyboard.lock()
MediaDevices.getDisplayMedia()
MediaDevices.getViewportMedia()
MediaDevices.selectAudioOutput()
MediaStreamTrack.sendCaptureAction()
Navigator.share()
PaymentRequest.show()
PresentationRequest.start()
RemotePlayback.prompt()
Serial.requestPort()
USB.requestDevice()
Keyboard.lock()
Window.getScreenDetails()
Window.open()
Window.queryLocalFonts()
Window.showOpenFilePicker()
Window.showSaveFilePicker()
Window.showDirectoryPicker()
WindowClient.focus()
XRSystem.requestSession()
Sticky Aktivierung
Sticky Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer einen Button gedrückt, eine Maus bewegt, ein Menü verwendet oder eine andere Nutzerinteraktion durchgeführt hat. Sie wird nach ihrer erstmaligen Einstellung nicht zurückgesetzt (im Gegensatz zur transienten Aktivierung).
APIs, die eine sticky Aktivierung erfordern (nicht abschließend):
beforeunload
EreignisNavigator.vibrate()
VirtualKeyboard.show()
- Autoplay von Media und Web Audio APIs (insbesondere für
AudioContexts
).
UserActivation API
Um programmatisch zu bestimmen, ob ein Fenster entweder sticky oder transiente Nutzeraktivierung hat, bietet die UserActivation
API zwei Eigenschaften, die über navigator.userActivation
verfügbar sind:
UserActivation.hasBeenActive
zeigt an, ob das Fenster eine sticky Nutzeraktivierung hat.UserActivation.isActive
zeigt an, ob das Fenster eine transiente Nutzeraktivierung hat.