受用户激活限制的功能
为了确保应用程序无法滥用可能在用户不希望时产生糟糕用户体验的 API,某些 API 只能在用户处于“主动交互”状态时使用,这意味着用户当前正在与网页进行交互,或者至少与页面进行过一次交互。浏览器限制对弹出窗口、全屏或振动 API 等敏感 API 的访问,仅限于用户主动交互,以防止恶意脚本滥用这些功能。本页面列出了仅在用户激活后才可用的 Web 平台功能。
用户激活意味着用户正在与页面进行交互,或者自页面加载以来已完成一次交互。通常,这会是一个按钮点击或其他 UI 交互。
更精确地说,触发激活的输入事件 是一个事件,它
- 具有设置为
true的isTrusted属性,并且 - 是以下类型之一
keydown(除 Esc 键或用户代理保留的快捷键外)mousedownpointerdown(如果pointerType是“mouse”)pointerup(如果pointerType不是“mouse”)touchend
如果已触发激活,用户代理会在两种用户激活窗口状态之间进行区分:粘滞(sticky)和瞬时(transient)。
瞬时激活与粘滞激活的比较
瞬时激活与粘滞激活的区别在于,瞬时激活仅持续很短时间,在某些情况下使用受保护的功能时可能会被消耗(停用),而粘滞激活会一直持续到会话结束。
基于瞬时激活的功能限制可确保它们仅在用户直接触发时才可用。相比之下,粘滞激活主要用于限制不应在页面加载时自动触发的功能,例如弹出窗口。
瞬时激活
瞬时激活 是一种窗口状态,表明用户最近按下了按钮或执行了其他用户交互。瞬时激活会在超时后过期(如果未通过进一步的交互续订),并且还可能被某些 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()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()
粘性激活
粘滞激活 是一种窗口状态,表明用户在会话中的某个时间点按下了按钮、使用了菜单或执行了其他用户交互。与瞬时激活不同,它在初始设置后不会重置。
需要粘滞激活的 API(不详尽)
UserActivation API
要以编程方式确定窗口是否具有粘滞或瞬时用户激活,UserActivation API 提供了两个可以通过 navigator.userActivation 访问的属性。
UserActivation.hasBeenActive指示窗口是否具有粘滞用户激活。UserActivation.isActive指示窗口是否具有瞬时用户激活。