【发布时间】:2017-10-10 17:29:58
【问题描述】:
我对 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();
}
}
我正在使用谷歌浏览器,如果有帮助的话。
谢谢!
【问题讨论】:
-
这是一种奇怪的方法吗?在编造自己的怪癖之前,您是否考虑过其他解决方案?
-
@adeneo 这个函数对我来说看起来很标准,我已经用过很多次了。 PS:不要低调侮辱少数加入并发布好问题的新人。
-
@Feathercrown - 我不是在侮辱,但这很奇怪。查看代码,正确的做法似乎是将不同的函数绑定到两个事件,并直接使用 keyCode 进行比较。我想我从未见过有人使用像这样的对象(带有数字键?) 来比较键,即使您声称您已经使用过很多次?我的意思是,你到底为什么不直接使用
if (e.which === 39) ...。 -
@adeneo 好的,是的,它应该是一个数组。至于数组的点,您可以在按下事件之外使用键信息,并访问在当前按下期间按住的键。例如。
h被按住,然后玩家按下d,现在你可以看到h是否被这个对象按住。这在画布游戏中很常见。对于一次性的关键反应,您的方法就足够了,而且是首选,因为它不太复杂,但它不允许对键进行完全跟踪。 -
@adeneo 至于使用单独的
if语句,它变得太长了。当您基本上可以用一条线检测所有键时,为什么要使用它们?基本上,数组用于存储,这对于解决这个问题(在问题中)和许多其他问题至关重要,例如跟踪按住的键,并且非if策略更短并捕获所有键放入数组中,允许通过键码轻松访问,而无需为要检测的每个键添加一行。使用带有自己的ifs 的单个变量进行存储是可行的,但数组再次更易于使用。
标签: javascript keylogger