JS 键盘记录器没有正确接受 keyup
JS keylogger not accepting keyup correctly
我是 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();
}
}
我正在使用 Google Chrome,如果有帮助的话。
谢谢!
我认为它可以正确识别击键,因为数组正在正确更新。问题是您的函数(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");}
请注意在非工作示例中,日志记录仅发生在按下事件时,即调用您的函数时。在 "working" 示例中,无论键事件如何,都会发生日志记录,但您的函数仍将无法触发,因为它们仍然会在键事件发生时发生。这是一个完整的示例:
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()
标记为 "space"。 :P
我是 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();
}
}
我正在使用 Google Chrome,如果有帮助的话。
谢谢!
我认为它可以正确识别击键,因为数组正在正确更新。问题是您的函数(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");}
请注意在非工作示例中,日志记录仅发生在按下事件时,即调用您的函数时。在 "working" 示例中,无论键事件如何,都会发生日志记录,但您的函数仍将无法触发,因为它们仍然会在键事件发生时发生。这是一个完整的示例:
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()
标记为 "space"。 :P