问题
我自己写了一个可以自定义监听快捷键组合的模块,
在写按键弹起的函数时候,发现了一个奇怪的现象。
如果我先按下⌘(不松开)再按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"