由用户激活触发的功能
为了确保应用程序无法滥用在不希望的行为时可能导致糟糕用户体验的 API,某些 API 只能在用户处于“主动交互”状态下使用,这意味着用户当前正在与网页交互,或者至少与页面交互过一次。浏览器限制对弹出窗口、全屏或振动等敏感 API 的访问,以防止恶意脚本滥用这些功能。此页面列出了仅在用户激活后可用的 Web 平台功能。
用户激活意味着用户当前正在与页面交互,或者在页面加载后完成了交互。通常,这指的是点击按钮或与 UI 进行其他用户交互。
更准确地说,“触发激活的输入事件”是指满足以下条件的事件:
- 其
isTrusted
属性设置为true
,并且 - 属于以下类型的事件:
keydown
(除了 Esc 键或用户代理保留的快捷键)mousedown
pointerdown
(如果pointerType
为“mouse”)pointerup
(如果pointerType
不为“mouse”)touchend
如果触发了激活,用户代理会区分两种类型的用户激活窗口状态:粘性和瞬时。
瞬时激活
瞬时激活 是一种窗口状态,表示用户最近按下了按钮、移动了鼠标、使用了菜单或执行了其他用户交互。瞬时激活在超时后会过期(如果未通过进一步的交互续期),并且也可能被某些 API(如 Window.open()
)消耗。
需要瞬时激活的 API(列表不完整)
Clients.openWindow()
Clipboard.read()
Clipboard.readText()
Clipboard.write()
Clipboard.writeText()
ContactsManager.select()
Document.requestStorageAccess()
DocumentPictureInPicture.requestWindow()
Element.requestFullScreen()
Element.requestPointerLock()
EyeDropper.open()
GPUAdapter.requestAdapterInfo()
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()
粘性激活
粘性激活 是一种窗口状态,表示用户按下了按钮、移动了鼠标、使用了菜单或执行了其他用户交互。它在最初设置后不会重置(与瞬时激活不同)。
需要粘性激活的 API(列表不完整)
beforeunload
事件Navigator.vibrate()
VirtualKeyboard.show()
- 媒体和 Web 音频 API 的自动播放(特别是对于
AudioContexts
)。
UserActivation API
要以编程方式确定窗口是否具有粘性或瞬时用户激活,UserActivation
API 提供了两个属性,可通过 navigator.userActivation
使用。
UserActivation.hasBeenActive
指示窗口是否具有粘性用户激活。UserActivation.isActive
指示窗口是否具有瞬时用户激活。