Одновременное нажатие более шести клавиш с помощью JavaScript

Работая над простой игрой, я заметил, что когда у меня одновременно нажаты шесть клавиш на клавиатуре, перехват событий keydown и keyup в документе веб-приложения становится непредсказуемым. В следующем фрагменте кода перечисленные клавиши перестают отображаться после того, как шесть клавиш, а иногда и меньше, удерживаются нажатыми.

<!DOCTYPE html>
<html>
<head>
  <title>Keyboard test</title>
</head>
<body>
  <div id="target"></div>

<script>

var target = document.getElementById('target');
var keyInventory = {};
var REFRESH_RATE = 1000 / 60;

document.addEventListener('keyup', function(e) {
  keyInventory['Key code ' + e.keyCode] = false;
});

document.addEventListener('keydown', function(e) {
  keyInventory['Key code ' + e.keyCode] = true;
});

setInterval(function() {
  target.innerHTML = JSON.stringify(keyInventory).replace(/,/g, '<br />');
}, REFRESH_RATE);

</script>
</body>
</html>

Браузер блокирует некоторые комбинации или браузер рисует линию на шести с событиями «keyup» и «keydown»? Есть ли какое-то поведение по умолчанию, которое необходимо предотвратить? Он одинаков для всех браузеров? Есть ли способ разрешить регистрацию более шести любых комбинаций клавиш?


person Lucas van Heerikhuizen    schedule 27.11.2017    source источник
comment
Вы уверены, что это не ваша клавиатура имеет ограничение на одновременное нажатие клавиш?   -  person Erich Kitzmueller    schedule 27.11.2017
comment
Вы, кажется, правы! My Mac Keyboard Viewer также обрабатывает только шесть клавиш одновременно. Я не ожидал, что это будет проблема ОС. Я помню, как играл в игры для двух игроков на клавиатуре на гораздо более старых компьютерах... хотя теперь я сомневаюсь в своей памяти.   -  person Lucas van Heerikhuizen    schedule 27.11.2017


Ответы (1)


Скорее всего проблема в вашей клавиатуре. IIRC, USB может поддерживать только 6 одновременных нажатий клавиш. (Не USB-клавиатуры, я имею в виду буквально протокол USB). Из-за этого ограничения многие потребительские клавиатуры также поддерживают только 6 одновременных клавиш.

Если вы хотите большего (также известного как N-KRO), вам нужно будет купить клавиатуру, которая поддерживает это, а также, скорее всего, использовать PS/2. Потому что, если не считать странных взломов протокола USB, PS/2 — единственное, что поддерживает бесконечное число нажатий клавиш.

Так что на самом деле ваша память, вероятно, правильная. Поскольку раньше большинство клавиатур были PS/2, все они (теоретически) могли поддерживать N-KRO.

person Kallmanation    schedule 27.11.2017
comment
Поскольку это оказалось аппаратной проблемой, а не проблемой JavaScript или браузера, это должно считаться решением. - person Lucas van Heerikhuizen; 28.11.2017