为各种用例(包括交互式网站、游戏以及远程桌面或应用流式传输)提供沉浸式全屏体验。
随着越来越多的用户将大部分时间花在浏览器中,富有互动性的网站、游戏、远程桌面流式传输和应用流式传输都致力于提供沉浸式全屏体验。为此,网站需要在全屏模式下访问特殊按键和键盘快捷键,以便用于导航、菜单或游戏。可能需要按的键包括 Esc、Alt + Tab、Cmd + ` 和 Ctrl + N。
默认情况下,这些按键不适用于 Web 应用,因为它们会被浏览器或底层操作系统捕获。借助 Keyboard Lock API,网站可以使用主机操作系统允许的所有可用按键(请参阅浏览器兼容性)。
使用 Keyboard Lock API
Keyboard API 的 Keyboard
接口提供了一些函数,可切换从实体键盘捕获按键操作,以及获取有关用户键盘布局的信息。
前提条件
现代浏览器中提供两种类型的全屏模式:通过 Fullscreen API 由 JavaScript 发起的全屏模式,以及由用户通过键盘快捷键发起的全屏模式。只有在 JavaScript 启动的全屏处于活动状态时,才能使用 Keyboard Lock API。下面是 JavaScript 启动的全屏模式示例:
await document.documentElement.requestFullscreen();
功能检测
您可以使用以下模式检查是否支持 Keyboard Lock API:
if ('keyboard' in navigator && 'lock' in navigator.keyboard) {
// Supported!
}
锁定键盘
Keyboard
接口的 lock()
方法在启用对实体键盘上任何键或所有键的按键按下操作的捕获后,会返回一个 Promise。此方法只能捕获由底层操作系统授予访问权限的密钥。lock()
方法接受一个或多个要锁定的按键代码的数组。如果未提供任何按键代码,则所有按键都会锁定。界面事件 KeyboardEvent 代码值规范中提供了有效键码值的列表。
捕获所有按键
以下示例会捕获所有按键操作。
navigator.keyboard.lock();
捕获特定按键
以下示例会捕获 W、A、S 和 D 键。无论按键时使用了哪些修饰符,它都会捕获这些按键。假设采用的是美国 QWERTY 布局,注册 "KeyW"
可确保将 W、Shift + W、Control + W、Control + Shift + W 以及包含 W 的所有其他按键修饰符组合发送到应用。同样,"KeyA"
、"KeyS"
和 "KeyD"
也是如此。
await navigator.keyboard.lock([
"KeyW",
"KeyA",
"KeyS",
"KeyD",
]);
您可以使用键盘事件响应捕获的按键按下操作。例如,以下代码使用 onkeydown
事件:
document.addEventListener('keydown', (event) => {
if ((event.code === 'KeyA') && !(event.ctrlKey || event.metaKey)) {
// Do something when the 'A' key was pressed, but only
// when not in combination with the command or control key.
}
});
解锁键盘
unlock()
方法会解锁 lock()
方法捕获的所有按键,并同步返回。
navigator.keyboard.unlock();
关闭文档时,浏览器始终会隐式调用 unlock()
。
演示
您可以在 Glitch 上运行演示来测试 Keyboard Lock API。请务必查看源代码。点击下面的“进入全屏”按钮,即可在新窗口中启动演示,以便其进入全屏模式。
安全注意事项
此 API 的一个问题是,它可用于抓取所有按键,并(与 Fullscreen API 和 PointerLock API 结合使用)阻止用户退出网页。为防止这种情况,规范要求浏览器提供一种方法,让用户能够退出键盘锁定状态,即使 API 请求了所有按键也是如此。在 Chrome 中,此紧急退出方式是按住 Esc 键(两秒钟)以触发退出键盘锁定。
实用链接
致谢
本文由 Joe Medley 和 Kayce Basques 审核。键盘锁定规范由 Gary Kacmarcik 和 Jamie Walch 编写。 主打图片由 Unsplash 用户 Ken Suarez 提供。