使用下面的代码,当按下某个键时,如果键代码尚未存在,则将其键代码推送到键映射数组,并且当键被释放时,其键代码将从数组中取出。通过不断地将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);
如果我同时按住a和d键盘中存在他们的键码,那么如果我按住w,则所有三个键码都存在。现在,当我放开它时,它已从阵列中移除,但即使我仍然按住d,也是如此。
然后我发现我可以按住a,w和d并将它们全部放入键盘映射中,但是当我按住它时,它不会在键盘映射中放入w,a和s。将放入其中两个的组合,但第三个不会。
谁能告诉我发生了什么?
答案 0 :(得分:1)
您的比较实际上是一项任务。将if(keymap[i] = e.keyCode)
更改为
if (keymap[i] == e.keyCode)
// ^
此外,您应该使用局部变量:
for(var i = 0; …
// ^^^
虽然对于你的数组应该是唯一的项目无关紧要,但是你需要在删除项目之后减少计数器变量i
,否则你跳过检查下一个项目:
keymap.splice(i--,1)
// ^^