使用JavaScript读取多个同时按下的键盘输入

3

我注意到在JavaScript中处理键盘输入时有些奇怪的行为。也许我错过了一些非常明显的东西,但是是否存在某种规则来确定哪些按键可以同时按下?

我正在使用布尔变量来保存四个键的状态,如下所示,这允许许多并发的按键操作(硬件允许的情况下):

var up = false, left = false, right = false, space = false;

function keydown(e) {
    if (e.keyCode == 32)
        space = true;
    if (e.keyCode == 38)
        up = true;
    if (e.keyCode == 37)
        left = true;
    if (e.keyCode == 39)
        right = true;
}

function keyup(e) {
    if (e.keyCode == 32)
        space = false;
    if (e.keyCode == 38)
        up = false;
    if (e.keyCode == 37)
        left = false;
    if (e.keyCode == 39)
        right = false;
}

在两台机器上,我尝试了以下的 jsfiddle。你可以同时按下空格、上箭头和右箭头,但是却不能同时按下空格、上箭头和左箭头。在这两台机器上,在 Chrome、FF 和 IE 中的表现都是一样的。但在第三台机器上能够完美地按住所有4个键。
现在可能这与硬件有关,但我的主要问题是为什么左右键的操作会有差异?这似乎是不一致的,我相信这样做肯定有一个合理的原因。
(您必须在结果窗格内单击才能触发事件) http://jsfiddle.net/SYs5b/

1
这很可能取决于键盘(或键盘驱动程序)。一个键盘可以允许同时按下更多的键,而另一个型号/品牌则不行。你是否尝试使用同一把键盘在三台机器上操作? - Shaz
@Shaz 你说得对,这确实取决于品牌。但它也取决于你按下的哪些键。SPACE + UP + RIGHT = 3个键可以正常工作。SPACE + UP + LEFT = 只有2个键被注册。我想知道为什么会不一致,我猜。 - Polynomial
我认为这只是不同键盘布线方式的问题。我记得大约10年前发生过这种情况。我必须使用两个不同的键盘来玩两个不同的游戏。 - Shaz
1个回答

2
为了省钱,键盘制造商经常将许多按键放在同一总线上。这会防止同时按下键盘同一区域的多个按键。有时甚至会防止整个键盘跨越按下超过2个按键。通常,Shift、Ctrl 和 Alt 键不受此限制,因此您可以同时按住 Shift 并按下其他2个键,它仍然可以正常工作。
即使是高端游戏键盘也经常具有类似的硬件限制,尽管上限要高得多,以便在正常游戏过程中不太可能达到。
这也被称为“幽灵按键”,当您按下的键似乎没有响应时。

谢谢解释。但我仍然不太明白为什么在这两种键盘上,SPACE + UP + RIGHT 和 SPACE + UP + LEFT 表现出完全不同的特性 - 我本来期望这些按键组合的工作方式是相同的。也许这就是我不是键盘制造商的原因吧。 - Polynomial
1
有趣的信息。如果有人有更多信息或链接,那将非常有用。原因是在js中组合键以提高生产力很有用,但即使有了这个答案,我也不知道哪些键组合有很好的工作机会。 - Damien Golding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接