JS键盘记录器无法正确接受密钥

时间:2017-10-10 17:29:58

标签: javascript keylogger

我是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();

    }
}

我正在使用谷歌浏览器,如果这有帮助。

谢谢!

1 个答案:

答案 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