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