Javascript键控不是';当命令和另一个命令被按下时调用

Javascript键控不是';当命令和另一个命令被按下时调用,javascript,jquery,Javascript,Jquery,这是Mac唯一的问题;我在windows上试用过,效果很好。 我有一个脚本,可以保存在keydown上按下的键,并在keydup上删除它们 $(function(){ var keys = []; $(document).keydown(function(event) { keys[event.which] = true; }); $(document).keyup(function(event) { delete keys[e

这是Mac唯一的问题;我在windows上试用过,效果很好。

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

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

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

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

        console.log(keys);
    });
});
我现在所做的就是在控制台上记录keyup之后剩下的任何东西,这应该什么都没有。当您同时按任意数量的键时,此功能将按预期工作

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

这只发生在Mac电脑上,而且只发生在按下其中一个键是命令键时。下面是一个非常简单的例子


有什么想法吗?

每当你按下
命令时,Mac都会修改你的按键,因此正常的
按键事件永远不会触发

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

C
K
时,它们会正常注册。同时按下两个按钮时,Mac会捕获并修改
K
。在修改
K
时,Mac会以某种方式使
K
keyup
事件不会按预期触发<然而,code>C
keyup
按预期工作

由于
K
keyup
从未实际触发,因此它无法从
keys
中正确删除匹配的元素。稍后,当您在不使用
C
的情况下按
K
时,
keydown
事件将覆盖
键中现有的
keydown
。当
K
keyup
正确启动时,它会按预期工作


除了用于输入ASCII字符的所有普通键, 键盘通常有许多特殊用途的键,它们可以执行其他操作 东西。这些不一定会产生与正常情况相同的事件 键,并且它们在浏览器之间显示的一致性较差


。这篇文章对所有与
关键
相关的问题都有潜在的帮助。

我无法解决这个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兼容的人

那很有趣。所以我照你说的做了。在
keyup
上,从不调用
K
。更有趣的是,如果用
K
按下
C
,则实际上不会调用
keypress
事件。我知道
keypress
事件即使没有特殊的键也很挑剔,所以这并不奇怪。是否有一个
keyup
在没有匹配的
kedown
的情况下发生?可能是mac完全从修改后的
K
中删除了
keyup
事件,而不是试图模拟其他键。是的,
keyup
C
K
中都会发生,但我只为
C
获得了一个匹配的
keyup
事件。那么我的理论基本上是正确的。Mac没有为不同的密钥创建一个不匹配的
keyup
事件,而是对其进行了大量修改,以至于浏览器根本无法拾取
keyup
。我会相应地更新我的答案。诅咒你的苹果!shakes fistBtw,而不是使用可以使用
var-keys={}的数组console.log(JSON.stringify(keys)):)@Jack,这有什么好处?我想使用数组。为什么?我无法想象为什么元素的顺序会产生不同,而稀疏数组似乎是错误的数据类型。实际上,我使用的应用程序的顺序是至关重要的!这就是我需要数组的原因。排序不会告诉您哪个键先到,那么您如何使用包含键代码的排序?不是说你错了,我只是好奇。