keyboard.lock使用
最近在做WebShell自定义热键,遇到的问题是网页热键受限于浏览器和操作系统,有些热键无法捕获,比如
command t
。经过调查发现
navigator.keyboard.lock
可以解决这个限制问题,这里记录下使用过程中的一些问题和心得
不可拦截热键
以Mac为例,实际测试比如以下几个热键不支持拦截。即JS层面我们无法捕获这类按键,也就阻止默认行为
1 | ⌘ N 创建新window |
这个似乎无解,但有了lock api 这些就有可能解决了
lock api
- lock可以不传入参数即锁定所有按键
- lock可以传入参数即锁定指定按键,这里的按键并不支持锁定修饰键
1 | navigator.keyboard.lock(["KeyW", "KeyA", "KeyS", "KeyD"]); |
目前仅支持全屏模式
,非全屏模式下lock并不会报错但也不work。
- System keyboard lock is only available when the document is in fullscreen mode, and only from a secure origin.
见 https://github.com/WICG/keyboard-lock/blob/gh-pages/explainer.md
兼容性上:
Chrome/Edge/Opera支持,Firefox/Safari不支持
例子
- https://keyboard-lock.glitch.me/
- https://github.com/alanhg/express-demo/blob/master/test/keyboard-lock/lock.html
PWA下
PWA下即使非全屏,navigator.keyboard.lock
后也是可以正常捕获按键的。但不同OS下表现并不一致,因此即使PWA,也建议在全屏下使用热键,体验会是最好的。
写在最后
lock api解决了网页热键受限的痛点,但可惜的是几个主流浏览器还没完全支持,期待支持的一天吧。