当按下Command和其他按钮时,不会调用Javascript Keyup

时间:2014-08-22 02:09:38

标签: javascript jquery

这是Mac唯一的问题;我在Windows上试过这个并且工作正常。

我有一个脚本可以保存keydown上按下的键,并在keyup上删除它们。

$(function(){
    var keys = [];

    $(document).keydown(function(event) {
        keys[event.which] = true;
    });

    $(document).keyup(function(event) {
        delete keys[event.which];

        console.log(keys);
    });
});

我现在所做的就是控制台记录密钥后留下的任何东西,这应该是什么都没有。当您同时按任意数量的键时,这可以正常工作。

但是,当您按下command和任何其他键时,另一个键不会被释放!因此,console.log会将该密钥显示为true。这将保持true,直到您按下该键为止。

这只发生在Mac上,只有当其中一个按键是Command键时才会发生。以上是一个非常简单的plunker示例。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

只要您按Command,Mac就会修改您的密钥,因此正常的keyup事件永远不会触发。

C =命令键和K =非命令键

当您按CK时,他们会正常注册。虽然它们同时被按下,但Mac会捕获K并对其进行修改。在修改K时,Mac会以某种方式使K的{​​{1}}事件无法正常发生。 keyup的{​​{1}}按预期工作。

由于C的{​​{1}}实际上从未触发,因此无法从keyup正确删除匹配元素。稍后当您按K而不keyup时,keys事件将覆盖K中的现有C。当keydown的{​​{1}}正确触发时,它会按预期工作。


  

除了用于输入ASCII字符的所有普通键外,   键盘通常具有许多其他功能的特殊用途键   的东西。这些不一定产生与正常情况相同的事件   密钥,它们在浏览器中的一致性较低。

JavaScript Madness: Keyboard Events。所有keydown相关问题的潜在有用文章。

答案 1 :(得分:1)

我无法解决这个Mac问题,但这是我解决问题的方法。

如果您尝试使用键盘快捷键行为,此答案可以帮助您,用户按CMD + S进行保存,或类似的事情。这个答案不适用于可能正在构建游戏的人或者在每个运行框架中需要知道键盘的键控状态的人。遗憾!

在keydown返回的KeyboardEvent中,您可以执行以下操作

$(document).keydown(function(keyboardEvent) {

    if (keyboardEvent.metaKey){ 
        // on Mac, CMD is down ...or Meta key is down on pc

        console.log(keyboardEvent.meta + " & command key are down")
        switch (keyboardEvent.which) { 
            ...
        }
    }
});

如果您的键盘快捷方式与浏览器重叠,则需要确保取消键盘事件的传播,

keyboardEvent.preventDefault()

我希望这可以帮助那些想要与Mac兼容的键盘快捷键功能的用户!