Быстрый фон:
- При нажатии клавиши в браузере генерируются три события: keyDown, keyPress и keyUp.
- keyDown и keyUp имеют свойство keyCode, которое примерно является нажатием физической клавиши.
- keyPress также имеет набор свойств charCode, который учитывает ключи модификатора и раскладку клавиатуры (A и один и тот же keyCode, но другой charCode).
- все три события имеют свойства, указывающие, какие клавиши-модификаторы были нажаты во время этих событий.
Я являюсь основным разработчиком noVNC, и у меня есть сложная проблема: noVNC нужен перевод charCode значение без использования события keyPress по следующим причинам:
- noVNC необходимо отправлять события keyDown и keyUp отдельно на сервер VNC (иначе это не полностью функциональный клиент VNC).
- Что еще более важно, noVNC необходимо предотвратить действия клавиатуры по умолчанию при подключении, что означает вызов метода preventDefault() события keyDown. У этого есть побочный эффект, также предотвращающий срабатывание keyPress.
Из-за различий в раскладках клавиатуры (т.е. разных сопоставлений keyCode и charCode) я определяю, что noVNC потребуется таблица поиска для разных раскладок клавиатуры.
Но вот настоящая проблема: на альтернативных макетах, некоторые разные физические клавиши имеют САМЫЙ keyCode. Например, при раскладке клавиатуры azerty (французский) клавиши подчеркивания "-" (тире) и "_" генерируют keyCode 189. Ack!!!
Итак... как мне получить правильное сопоставление keyCode и charCode и предотвращать действия браузера по умолчанию в одно и то же время?
Кстати, я подозреваю, что решение этого будет применимо к другим интерактивным веб-приложениям и играм HTML5, так как вы часто хотите знать полную информацию о нажатой клавише, не вызывая никакой дополнительной реакции браузера на это нажатие клавиши.
Полезные ссылки:
- Здесь - полезная тестовая страница, в которой показаны три события и некоторые другие полезные свойства.
- Резюме о сумасшедшем состоянии ключевых событий в Javascript (спасибо @Tim)
- Quirksmode Обнаружение нажатий клавиш
- Quirksmode События - ключевые события
- noVNC issue с более подробным описанием проблемы.
Решение: см. мой пост ниже.