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