Funktionen, die durch Benutzeraktivierung gesteuert werden
Um sicherzustellen, dass Anwendungen APIs nicht missbrauchen, die bei unerwünschtem Verhalten zu einem schlechten Benutzererlebnis führen können, können einige APIs nur verwendet werden, wenn der Benutzer sich 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 Popups, Vollbild- oder Vibrations-APIs auf aktive Benutzerinteraktionen, um zu verhindern, dass bösartige Skripte diese Funktionen missbrauchen. Diese Seite listet Webplattform-Funktionen auf, die nur nach einer Benutzeraktivierung verfügbar sind.
Eine Benutzeraktivierung deutet entweder darauf hin, dass der Benutzer derzeit mit der Seite interagiert oder seit dem Laden der Seite eine Interaktion abgeschlossen hat. Dies ist typischerweise ein Klick auf einen Button oder eine andere Benutzerinteraktion mit der Benutzeroberfläche.
Genauer gesagt ist ein Aktivierungsereignis ein Ereignis, das:
- das Attribut
isTrusted
auftrue
gesetzt hat, und - ein Ereignis der folgenden Typen ist:
keydown
(außer der Esc-Taste oder einer vom Benutzeragenten reservierten Tastenkombination)mousedown
pointerdown
(wennpointerType
"mouse" ist)pointerup
(wennpointerType
nicht "mouse" ist)touchend
Wenn eine Aktivierung ausgelöst wurde, unterscheidet der Benutzeragent zwischen zwei Arten von Benutzeraktivierungsfensterzuständen: Sticky und Transient.
Transiente Aktivierung
Transiente Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer kürzlich einen Button gedrückt, die Maus bewegt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Transiente Aktivierung läuft nach einem Timeout ab (sofern sie nicht durch weitere Interaktion erneuert wird) und kann auch von einigen APIs verbraucht werden (wie Window.open()
).
APIs, die transiente Aktivierung erfordern (Liste ist nicht vollständig):
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()
Window.getScreenDetails()
Window.open()
Window.queryLocalFonts()
Window.showDirectoryPicker()
Window.showOpenFilePicker()
Window.showSaveFilePicker()
WindowClient.focus()
XRSystem.requestSession()
Sticky Aktivierung
Sticky Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer einen Button gedrückt, die Maus bewegt, ein Menü benutzt oder eine andere Benutzerinteraktion durchgeführt hat. Sie wird nicht zurückgesetzt, nachdem sie einmal gesetzt wurde (im Gegensatz zur transienten Aktivierung).
APIs, die Sticky Aktivierung erfordern (nicht vollständig):
- Ereignis
beforeunload
Navigator.vibrate()
VirtualKeyboard.show()
- Autoplay von Media- und Web-Audio-APIs (insbesondere für
AudioContexts
).
UserActivation API
Um programmgesteuert zu bestimmen, ob ein Fenster entweder Sticky oder Transiente Benutzeraktivierung hat, bietet die UserActivation
API zwei Eigenschaften, die über navigator.userActivation
verfügbar sind:
UserActivation.hasBeenActive
gibt an, ob das Fenster eine Sticky Benutzeraktivierung hat.UserActivation.isActive
gibt an, ob das Fenster eine Transiente Benutzeraktivierung hat.