Быстрый фон:
- при нажатии клавиши в браузере генерируются три события: keyDown, keyPress и keyUp.
- keyDown и keyUp имеют свойство keyCode, которое примерно соответствует физической нажатой клавише.
- keyPress также имеет набор свойств charCode, который учитывает клавиши-модификаторы и раскладку клавиатуры (A и a имеют одинаковый keyCode, но разные charCode).
- все три события имеют свойства, указывающие, какие клавиши-модификаторы были нажаты во время этих событий.
Я главный разработчик noVNC, и у меня сложная проблема: noVNC нужен переведенный charCode< /strong> без использования события 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 с дополнительным обсуждением проблемы.
Решение: см. мой пост ниже.