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