Можно ли игнорировать события нажатия клавиш с 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 ключевых событий