控制多个键的奇怪事件被抑制

时间:2013-08-15 16:28:00

标签: javascript jquery keydown keyup keymapping

使用下面的代码,当按下某个键时,如果键代码尚未存在,则将其键代码推送到键映射数组,并且当键被释放时,其键代码将从数组中取出。通过不断地将keymap数组推送到控制台来测试它时,我发现了一些奇怪的东西。

var keymap = [];

$(window).keydown(function(e) {
    if($.inArray(e.keyCode,keymap) == -1) {keymap.push(e.keyCode);}
});

$(window).keyup(function(e) {
    for(i = 0;i < keymap.length;i++) {
        if(keymap[i] = e.keyCode) {keymap.splice(i,1);}
    }
});

setInterval(function() {console.log(keymap);},100);
  1. 如果我同时按住a和d键盘中存在他们的键码,那么如果我按住w,则所有三个键码都存在。现在,当我放开它时,它已从阵列中移除,但即使我仍然按住d,也是如此。

  2. 然后我发现我可以按住a,w和d并将它们全部放入键盘映射中,但是当我按住它时,它不会在键盘映射中放入w,a和s。将放入其中两个的组合,但第三个不会。

  3. 谁能告诉我发生了什么?

1 个答案:

答案 0 :(得分:1)

您的比较实际上是一项任务。将if(keymap[i] = e.keyCode)更改为

if (keymap[i] == e.keyCode)
//             ^

此外,您应该使用局部变量:

for(var i = 0; …
//  ^^^

虽然对于你的数组应该是唯一的项目无关紧要,但是你需要在删除项目之后减少计数器变量i,否则你跳过检查下一个项目:

keymap.splice(i--,1)
//             ^^