Перевести Javascript keyCode в charCode для раскладки клавиатуры без U.S(то есть azerty)
Быстрый фон:
- При нажатии клавиши в браузере генерируются три события: 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, так как вы часто хотите знать полную информацию о нажатой клавише, не вызывая никакой дополнительной реакции браузера на это нажатие клавиши.
Полезные ссылки:
Решение: см. мой пост ниже.
Ответы
Ответ 1
Я решил свой собственный вопрос. Это не 100% -ное решение, но оно должно охватывать большинство необходимых. Надеемся, что разработчики браузеров начнут интегрировать DOM Level 3 Events.
Просто для повторного итерации основных ограничений:
- События с ключами и клавишами должны сообщаться/отправляться в момент их фактического завершения. То есть отправка ключа вниз и смена ключа во время события keyPress недостаточна.
- Многие ключевые комбинации должны быть полностью обработаны во время события keyDown либо из-за того, что они никогда не запускают событие keyPress (например, Ctrl), либо потому, что действие по умолчанию должно быть остановлено в keyDown (WebKit), и это предотвращает событие keyPress.
- События клавиш и клавиш должны сообщать о переводе символьного кода, а не в значение keyCode.
Без какого-либо готового прозрения текущие версии браузера, как представляется, не позволяют полностью выполнить все три ограничения. Поэтому я решил немного ограничить ограничение №3.
-
В браузере keyDown событие добавляет событие в список вниз и проверяет, является ли это безопасным (без нежелательного поведения браузера по умолчанию):
-
Безопасный: ничего не делать до нажатия клавиши.
-
Небезопасный: немедленно сообщите/отправьте событие с нажатием клавиши. В этом случае ограничение № 3 ослабляется, поскольку эти ограниченные комбинации клавиш не переводятся в код символа (многие из них не имеют их, хотя в любом случае).
-
В браузере keyPress (которое происходит сразу после события keyDown) проверьте, является ли это безопасной комбинацией клавиш:
-
Безопасный: отправьте событие с нажатием клавиши. Обновите список клавиш вниз, используя переведенный код символа (event.which).
-
Небезопасный: ничего не делать, поскольку он уже был отправлен/отправлен во время keyDown.
-
В окне браузера keyUp найдите и удалите соответствующее событие из списка вниз и используйте переведенный код для отправки/отправки события события.
Некоторые дополнительные ссылки для интересных:
Ответ 2
Это абсолютное минное поле, и я настоятельно призываю вас не пытаться этого, если вы можете его избежать. Мало того, что длительная и запутанная история производителей браузеров не согласуется с поведением ключевых событий, есть также тот факт, что они все еще не согласны и все еще регулярно меняют ключевое поведение своих браузеров.
Следующее - лучшее, что я могу предложить, и окончательный ресурс в событиях ключевых слов браузера: http://unixpapa.com/js/key.html
Если вам нужно это сделать, я думаю, что вы получите множество таблиц отображения key code, которые будут устаревать очень быстро. Удачи.