keyup事件问题

发布于 2022-09-02 01:59:53 字数 2120 浏览 6 评论 0

问题

我自己写了一个可以自定义监听快捷键组合的模块,
在写按键弹起的函数时候,发现了一个奇怪的现象。

如果我先按下(不松开)再按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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清秋悲枫 2022-09-09 01:59:53

题主是要实现组合键的效果对吧。

JavaScript 提供了keydownkeyup这两个键盘事件给我们已经足够了。但是有个问题就是如果同时按两个键的话就会出现执行两次或多次的keydownkeyup事件,这样的话就不知道用户是否按了组合键了。

这样的话,只需要弄一个key的变量用来存放用户点击键的keyCode。然后再keydownkeyup事件里面判断是否我们需要的哪一些键的keyCode就行了。

代码如下:

var doc = document;
var key = [];

doc.onkeydown = doc.onkeyup = function(e){
    var e = e || event;
    key[e.keyCode] = e.type == 'keydown';
  
    if (key[16] && key[68]) {
      console.log('你按下了 shift + d');
    }
};

Demo


相关:

javascript multiple keys pressed at once


欢迎题主加入我们二次元前端群和我们一起玩耍,群号:291646098 (因为我们群主对你很感兴趣但是没有找到你qq号)

荒路情人 2022-09-09 01:59:53

⌘ + D 不是直接出戏了么。。 这是浏览器添加书签的热键
组合键按下的时候被浏览器程序本身捕获,页面就捕获不到了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文