0

使用下面的代码,当一个键被按下时,它的键码被推送到键映射数组(如果它不存在的话)并且当一个键被松开时,它的键码被从数组中取出。通过不断地将键盘映射数组推到控制台来测试这一点时,我发现了一些奇怪的事情。

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,它们的所有三个键码都会出现。现在,当我放开 w 时,它会从数组中删除,但即使我仍然按住 d,d 也是如此。

  2. 然后我发现我可以按住a、w和d,它们都会被放入keymap中,但是当我按住它们时,它不会将w、a和s放入keymap中。其中两个的组合将被放入,但第三个不会。

谁能告诉我发生了什么事?

4

1 回答 1

1

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

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

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

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

虽然对于您的数组来说,项目应该是唯一的并不重要,但您需要i在删除一个项目后减少计数器变量,否则您跳过检查下一个:

keymap.splice(i--,1)
//             ^^
于 2013-08-15T16:38:08.550 回答