@ Shog9 предложил мне скопировать мой ответ на дублированную версию этого вопроса:
Одна проблема, которая игнорируется, это пользователи, использующие метод ввода (редакторы), например. нелатинский текстовый ввод. IME, с которым я знаком, - это IM Kotoeri Hiragana на OSX, но существует множество других для японского языка (один только Kotoeri имеет несколько различных режимов ввода, и есть по крайней мере еще один основной режим, называемый ATOK), в дополнение к режимам для hangul, традиционный и упрощенный китайский, а также множество других менее известных языков. И эти методы ввода существуют на всех основных платформах (особенно Win, Mac и Linux).
Проблема, которую они представляют с точки зрения кода, аналогичного тому, что вы пытаетесь сделать, заключается в том, что точные нажатия на физическую клавишу не обязательно соответствуют фактическому вводу, который вводит пользователь.
Например, при наборе последовательности символов toukyou<enter>
в хирагане по умолчанию будет получена строка とうきょう
, обратите внимание, что в результирующем тексте нет <enter>
, потому что ввод подтверждает составленный текст. Но в дополнение к этому фактическая последовательность символов, которая появляется, изменяется при вводе:
t // t
と // to
とう // tou
とうk // touk
とうky // touky
とうきょ // toukyo
とうきょう // toukyou
Если память использовалась, когда я реализовал это в webkit, необходимо было сделать keyCode равным 229 для keyDown для всех ключей, набранных в IME (для compat с IE) - но я не могу вспомнить, каково поведение keyUp.
Стоит также отметить, что в некоторых IME вы не обязательно будете получать нажатия клавиш, нажатия клавиш или нажатия клавиш. Или вы получите несколько. Или все они отправляются вместе в конце ввода.
В общем, это очень ... нечистая ... часть реализаций событий DOM в настоящее время.