Событие javascript keypress
устарело:
https://developer.mozilla.org/en-US/docs/Web/API/Document/keypress_event
Некоторые люди советуют полагаться исключительно на событие keydown
, например ::10000* Keydown
isединственное событие клавиатуры, которое нам нужно
https://www.mutuallyhuman.com/blog/2018/03/27/keydown-is-the-only-keyboard-event-we-need/
Проблема в том, что keydown
и keypress
не являются синонимами.Критически, они не возвращают один и тот же символ во многих / большинстве случаев.Keydown
представляет, какая клавиша на клавиатуре была нажата, в то время как keypress
представляет, какой символ фактически набрал пользователь.
На английском языке различие важно в отношении регистра:
letter = String.fromCharCode(event.which);
При нажатии клавиши «a» на клавиатуре буква будет «a» с keypress
, ноэто «А» с keydown
.
Ситуация усложняется с языками JCK, поскольку keypress
получает правильные символы для международных раскладок клавиатуры, в отличие от keydown
, который преобразует все в однобайтовые символы.
события keydown и keyup теперь запускаются во время композиции IME:
https://www.fxsitecompat.com/en-CA/docs/2018/keydown-and-keyup-events-are-now-fired-during-ime-composition/
Итак, с keypress
не рекомендуется, что мы должны использовать, когда заботимся осимвол, который пользователь намеревался напечатать, учитывая регистр, не-ASCII-символы и многобайтовые символы?
Вопросы и ссылки по теме:
Событие keyup всегда возвращает заглавную букву => В ответе рекомендуется использовать keypress
.
String.fromCharCode не работает при событии нажатия клавиши => В ответе рекомендуется использовать keypress
.
String.fromCharCode при нажатии и нажатии клавиши возвращает неправильные символы => В ответе отмечается, что события keypress
и keydown
не являются взаимозаменяемыми.
Замена на устаревшую`keypress` DOM event => В ответе предлагается использовать keydown
, не отмечая различий, которые он имеет в плане обработки регистра букв, не-ascii символов и многобайтовых символов.Кроме того, предлагаемая альтернатива beforeinput
не поддерживает браузер.
Альтернатива для события нажатия клавиш в Firefox версии 65 + => Вопрос кратко опущен, с комментарием, предлагающим использовать keydown
или beforeinput
без устранения каких-либо ошибок, упомянутых выше.