Можно ли игнорировать события нажатия клавиш с keyCode = 229?

В начале я хотел отслеживать изменения в <input type="text"> в режиме реального времени (например, именно тогда, когда пользователь нажимает клавишу). onChange Событие не сработало, потому что оно срабатывает только тогда, когда пользователь нажимает Enter или удаляет фокус с элемента ввода. Тогда я увидел этот вопрос на Stackru. Я попробовал код из этого ответа, но проблема в том, что я не хочу получать уведомления о нажатии клавиш, которые не представляют печатные символы, поэтому мне пришлось изменить его таким образом, чтобы он проверял наличие в событиях печатных символов:

...

textInputElement.onKeyDown.listen((KeyboardEvent ev) {
  if (new String.fromCharCode(ev.keyCode).length > 0) {
    callAFunction();
  }
});

...

(+ то же самое изменение для onKeyUp событие)

Когда я проверил это в Dartium, я увидел это, сфокусировав элемент ввода, а затем нажав любую клавишу, keydown событие вызвано ev.keyCode = ev.which = 229 а также ev.charCode = 0, Сразу после этого события, другой keydown событие запускается с правильным ev.keyCode = ev.which нажатой клавиши и ev.charCode = 0, Я не понял, откуда взялся этот ключ 229, но увидел, что это печатный символ, å, Я искал в Интернете, и я обнаружил, что другие имеют эту проблему, а иногда они используют другие языки программирования и технологии. Одна важная ссылка - это, и выбранное исправление находится в этом очень маленьком коммите - они решили игнорировать все события, которые имеют keyCode = 229 с объяснением, что последние версии Chrome/Chromium/WebKit начали отправлять эти события нажатия клавиш перед каждыми стандартными событиями клавиатуры, и что их значение заключается в том, что пользователь нажал какую-то кнопку. но метод ввода все еще обрабатывает это, или редактор метода ввода обрабатывает ввод ключа.

Мой вопрос, это нормально игнорировать keydown события с keyCode = 229 если new String.fromCharCode(229) возвращает печатный символ å "Я подумал о возможной ситуации, когда имеется реальный ключ, который выдает тот же код ключа и соответствующий ему символ.

Я благодарю вас за любую помощь!

1 ответ

Краткий ответ - Нет. Вы можете игнорировать события нажатия клавиш с keyCode = 229, но только если они следуют сразу после события нажатия клавиши.

Если вы удерживаете определенные клавиши нажатыми, некоторые браузеры отправляют повторное событие keydown со значением keyCode, равным 229, в то время как другие снова отправляют исходный keyCode keydown. Некоторые браузеры отправляют 0 как keyCode, связанный с событием нажатия клавиши, и помещают код символа в свойство charCode.

Во всех случаях, насколько я могу судить из своих тестов, порядок событий всегда предсказуем:

keydown  (event.keyCode  = key-keyCode            ex: 65 = "A")
keypress (event.keyCode  = 0 | character-keyCode  ex: 97 = "a")  - conflated model
          event.charCode =     character-keyCode                 - split model
keydown  (event.keyCode  = 229 | key-keyCode      ex: 229 | 65)  - may be repeated
keyup    (event.keyCode  = key-keyCode            ex: 65)

Буква å используется во многих скандинавских языках. Вот события, полученные в Safari 6.1.5, когда клавиатура установлена ​​на шведский или финский язык и нажата буква å (слева от клавиши P):

EVENT    keyCode
keydown  219     ("[" key position)
keypress 229     (å)
keydown  229     (repeatedly, indicating that the Input Monitor is busy)
keyup    219

Обратите внимание, что начальный keyCode keydown равен 219, а не 229.

Чтобы сгенерировать 229 keyCode для начального события нажатия клавиши, вы можете нажать любую "мертвую клавишу". Например, на шведской клавиатуре на Mac клавиша, расположенная слева от клавиши BACKSPACE, ´ (острый акцент), как используется в словах, таких как дежа-вю. Когда вы нажимаете мертвую клавишу, символ появляется в поле ввода, но точка вставки не перемещается. Когда вы впоследствии вводите символ, который можно комбинировать с ним, браузер может заменить начальный символ мертвой клавиши составным символом (´ + e = é), который имеет свое собственное значение Unicode.

Вот события, которые вы увидите в Safari 6.1.5, когда пользователь нажимает и отпускает ´, а затем e на шведской клавиатуре:

EVENT    keyCode
keydown  229 (dead key)
keyup    187 (acute accent)
keydown  229 (second key is being treated)
keyup     69 ("E")

Обратите внимание, что события нажатия клавиш вообще не отправляются, потому что нет клавиши "é" как таковой, которая была нажата. Если вы хотите определить, какой символ ввел пользователь, вы можете подождать до второго нажатия, а затем прочитать символ из поля ввода.

Другими словами, вы можете игнорировать любые события нажатия клавиш с помощью 229 keyCode после события нажатия клавиши, но если вы игнорируете все 229 keyCodes, вы можете запретить пользователям добавлять различные диакритические символы.

Для получения дополнительной информации о keyCode 229, на сайте w3.org: свойство keyCode ключевых событий

Другие вопросы по тегам