JavaScript 中,前端捕捉键盘按键,如何处理组合键的问题?

2020-11-11 22:13:10 +08:00
 black11black

如题,简单实现了一下按键捕捉,但是复杂情况搞不定

想实现的需求是在页面里比如按一下 Ctrl,页面快进一页,而分别按组合键 Ctrl+1,Ctrl+2,Ctrl+3....等等分别对应不同的功能。

如果按照 document.onkeydown 的做法的话,按组合键的时候同时也会触发 Ctrl 的功能,这就不对了。另外 Ctrl 如果按住的话会连续触发绑定方法,导致页面多次渲染,是否有办法针对 Ctrl 连续触发单独搞一个绑定呢?

最后问一下带佬,网上查到这些捕捉方式,有什么区别啊。谢谢

window.addEventListener('keypress'()=>{})
document.onkeydown
1052 次点击
所在节点    问与答
4 条回复
zsdroid
2020-11-11 22:20:12 +08:00
e.ctrlKey
lithbitren
2020-11-12 03:59:47 +08:00
一般不用 addEventListenerr('keypress', () => {}),不好单独监听功能键,不好防冒泡,浏览器快捷键也容易冲突。

判断事件是否是组合键,在 document.onkeydown 的实现函数里面查看 event.ctrlKey 就行,注意返回 false 防止浏览器 ctrl+nwt 以外的快捷键冒泡。

然后可以考虑声明一个全局布尔变量作为控制锁并监听 document.onkeyup,普通数字字母 keydown 且是组合键的时候加锁再执行功能,ctrl 键 keyup 的时候看看有没有被锁,有锁的话说明是组合键就解锁然后跳过,没锁的话说明是单独按了 ctrl 则可以执行 ctrl 的功能,然后可以加个锁,用 settimeout 设定一两秒后自动解锁就可以防止快速的连续触发了。
lithbitren
2020-11-12 04:03:19 +08:00
不过 onkeyup 本身很难连发,如果不介意手抖 ctrl 按很多次的话,延时解锁也可以不用写进 onkeyup 的监听逻辑里
rodrick
2020-11-12 09:38:58 +08:00
```
let lockFlag = false
document.onkeydown = function (e) {
var keyCode = e.keyCode || e.which || e.charCode;
var ctrlKey = e.ctrlKey || e.metaKey;
if (ctrlKey && keyCode == 49) {
e.preventDefault
lockFlag = true
console.log('组合事件');
return false
}
}

document.onkeyup = function (e) {
var keyCode = e.keyCode || e.which || e.charCode;
// ctrl 抬起且锁(组合事件) 解锁
if (keyCode == 17 && lockFlag) {
// e.preventDefault
lockFlag = false
console.log('是组合事件,不执行 ctrl 事件,lockflag:' + lockFlag);
// return false
// ctrl 抬起且没锁(不是组合事件)
} else if (keyCode == 17 && !lockFlag) {
console.log('是 ctrl');
}
}
```
分开判断一下完事

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/724203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX