我是JS的新手,所以我可能会犯一些愚蠢的错误,但我的键盘记录器似乎没有正常运行。它可以正确接受多次击键,但是当一次击键时,它会同时识别为两次击键。有什么帮助吗?
这是我的代码:
var keymap = {};
onkeydown = onkeyup = function(e){
keymap[e.keyCode] = e.type == 'keydown';
if(keymap[39] && keymap[32]){ // Right+Space
jumpRight();
}
if(keymap[37] && keymap[32]){ // Left+Space
jumpLeft();
}
if(keymap[32]){ // Space
jump();
}
if(keymap[39]){ // Right
right();
}
if(keymap[37]){ // Left
left();
}
}
我正在使用谷歌浏览器,如果这有帮助。
谢谢!
答案 0 :(得分:0)
我认为它正确识别击键,因为阵列正在正确更新。问题是您的函数(left()
,right()
,jump()
等)仅在按键事件发生时触发。按住某个键时,有时它会继续触发keydown事件,有时它不会。这导致函数不会触发,即使你的程序知道密钥被按下了。
工作示例(始终显示数组值,而不仅仅是按键;显示数组值并不一定意味着函数触发):
var keymap = {};
onkeydown = onkeyup = function(e){
keymap[e.keyCode] = e.type == 'keydown';
if(keymap[39] && keymap[32]){ // Right+Space
jumpRight();
}
if(keymap[37] && keymap[32]){ // Left+Space
jumpLeft();
}
if(keymap[32]){ // Space
jump();
}
if(keymap[39]){ // Right
right();
}
if(keymap[37]){ // Left
left();
}
}
document.onkeydown=onkeydown;
document.onkeyup=onkeyup;
function jump(){}
function left(){}
function right(){}
function jumpLeft(){}
function jumpRight(){}
setInterval(function(){console.log(keymap[37]," ",keymap[32]," ",keymap[39]);},5);
非工作示例(现在如何,仅在按键上显示数组值;显示数组值==函数触发):
var keymap = {};
onkeydown = onkeyup = function(e){
keymap[e.keyCode] = e.type == 'keydown';
if(keymap[39] && keymap[32]){ // Right+Space
jumpRight();
}
if(keymap[37] && keymap[32]){ // Left+Space
jumpLeft();
}
if(keymap[32]){ // Space
jump();
}
if(keymap[39]){ // Right
right();
}
if(keymap[37]){ // Left
left();
}
}
document.onkeydown=onkeydown;
document.onkeyup=onkeyup;
function jump(){console.log("jump");}
function left(){console.log("left");}
function right(){console.log("right");}
function jumpLeft(){console.log("jumpleft");}
function jumpRight(){console.log("jumpright");}
请注意,在非工作示例中,日志记录仅发生在keydown事件上,即调用函数时。在“工作”示例中,无论关键事件如何,都会发生日志记录,但您的函数仍然无法触发,因为它们仍然发生在关键事件发生时。这是一个完全有效的例子:
var keymap = {};
onkeydown = onkeyup = function(e){
keymap[e.keyCode] = e.type == 'keydown';
}
document.onkeydown=onkeydown;
document.onkeyup=onkeyup;
function jump(){console.log("jump");}
function left(){console.log("left");}
function right(){console.log("right");}
function jumpLeft(){console.log("jumpleft");}
function jumpRight(){console.log("jumpright");}
function main(){
if(keymap[39] && keymap[32]){ // Right+Space
jumpRight();
}
if(keymap[37] && keymap[32]){ // Left+Space
jumpLeft();
}
if(keymap[32]){ // Space
jump();
}
if(keymap[39]){ // Right
right();
}
if(keymap[37]){ // Left
left();
}
}
setInterval(main,250);
希望这有帮助!
祝你好运学习更多JS!
P.S。:您将left()
标记为“空格”。 :P