Чтение нескольких одновременных вводов с клавиатуры с использованием JavaScript

Я заметил странное поведение при вводе с клавиатуры в 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 ответ

Решение

Чтобы сэкономить деньги, производители клавиатур часто помещают множество клавиш в одну шину. Это предотвращает одновременное нажатие нескольких клавиш в одной и той же области клавиатуры. Иногда это даже предотвращает одновременное нажатие более 2 клавиш на всей клавиатуре. Часто клавиши shift, ctrl и alt не входят в это ограничение, поэтому вы можете удерживать клавишу shift и одновременно нажимать 2 другие клавиши, и это все равно будет работать нормально.

Даже у высококлассных игровых клавиатур часто есть подобное аппаратное ограничение, хотя ограничение намного выше, так что вряд ли оно будет достигнуто во время нормального хода игры.

Это также называется "ореолом", когда нажимаемые клавиши, кажется, не регистрируются.

Другие вопросы по тегам