Я просмотрел выше ответы и предлагаемый keydown/ keyupподход работает только при особых обстоятельствах. Если пользователь отключает Alt-Tab или использует ключевой жест для открытия нового окна или вкладки браузера, тогда keydownбудет зарегистрирован a , и это нормально, потому что в этот момент невозможно определить, является ли ключ тем, что отслеживает веб-приложение. , либо стандартный ярлык браузера или ОС. Вернувшись на страницу браузера, он все равно будет думать, что ключ удерживается, хотя к тому времени он был выпущен. Или какая-то клавиша просто удерживается, пока пользователь переключается на другую вкладку или приложение с помощью мыши, а затем отпускается за пределы нашей страницы.
Клавиши-модификаторы ( Shiftи т. Д.) Можно отслеживать с помощью mousemoveи т. Д., Предполагая, что при переходе назад ожидается хотя бы одно взаимодействие с мышью, что часто имеет место.
Для большинства всех остальных клавиш (кроме модификаторов, Tab, Delete, но в то числе Space, Enter), мониторинг keypressбудет работать для большинства приложений - ключ удерживается в нажатом положении будет продолжать огнь. Однако есть некоторая задержка при сбросе ключа из-за периодичности keypressсрабатывания. В принципе, если keypressне продолжать стрелять, то можно исключить большинство ключей. Это в сочетании с модификаторами довольно герметично, хотя я не изучал, что делать с Tabи Backspace.
Я уверен, что есть какая-то библиотека, которая абстрагируется от этой слабости DOM, или, может быть, какое-то стандартное изменение DOM позаботилось об этом, поскольку это довольно старый вопрос.