keyup事件问题
问题
我自己写了一个可以自定义监听快捷键组合的模块,
在写按键弹起的函数时候,发现了一个奇怪的现象。
如果我先按下⌘
(不松开)再按D
,
此时松开D
不会触发 keyup
如果我先按下D
(不松开)再按⌘
,
此时松开⌘
则会触发 keyup
代码
const Immutable = require('immutable');
let listenList = Immutable.Map({});
let keyDownGroup = [];
const getKeyGroupString = keyGroupArray => {
let keyGroup = Array.from(keyGroupArray);
keyGroup.sort();
return keyGroup.join(',');
}
/**
* 添加快捷键监听
* kg Array 快捷键组合
* handler Function 被监听的事件
**/
const addListener = (kg, handler) => {
let keyGroup = getKeyGroupString(kg);
listenList = listenList.update(
keyGroup,
handlerList => handlerList ? handlerList.push(handler) : Immutable.List([handler])
);
};
/**
* 移除快捷键监听
* kg Array 快捷键组合
* deleteHandler Function 要被移除监听的事件(如果为空则移除该快捷键组合的所有事件)
**/
const removeListener = (kg, deleteHandler) => {
let keyGroup = getKeyGroupString(kg);
if (listenList.hash(keyGroup)) {
if (deleteHandler) {
listenList = listenList.update(
keyGroup,
handlerList => handlerList.filter(handler => handler !== deleteHandler)
);
} else {
listenList = listenList.delete(keyGroup);
}
}
}
window.addEventListener('keydown', event => {
keyDownGroup = Array.from(new Set([...keyDownGroup, event.keyCode]))
let keyDownGroupString = getKeyGroupString(keyDownGroup);
if (listenList.has(keyDownGroupString)) {
listenList.get(keyDownGroupString).forEach(
handler => handler()
);
}
});
window.addEventListener('keyup', event => {
// 出现奇怪问题的地方……
console.log('keyup...');
// keyDownGroup = [];
keyDownGroup.pop();
});
module.exports = {
addListener,
removeListener
}
userAgent
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.110 Electron/0.36.7 Safari/537.36"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
题主是要实现组合键的效果对吧。
JavaScript 提供了
keydown
和keyup
这两个键盘事件给我们已经足够了。但是有个问题就是如果同时按两个键的话就会出现执行两次或多次的keydown
和keyup
事件,这样的话就不知道用户是否按了组合键了。这样的话,只需要弄一个
key
的变量用来存放用户点击键的keyCode
。然后再keydown
和keyup
事件里面判断是否我们需要的哪一些键的keyCode
就行了。代码如下:
Demo
相关:
javascript multiple keys pressed at once
欢迎题主加入我们二次元前端群和我们一起玩耍,群号:291646098
(因为我们群主对你很感兴趣但是没有找到你qq号)⌘ + D
不是直接出戏了么。。 这是浏览器添加书签的热键组合键按下的时候被浏览器程序本身捕获,页面就捕获不到了