Подтвердить что ты не робот

Перевести 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, так как вы часто хотите знать полную информацию о нажатой клавише, не вызывая никакой дополнительной реакции браузера на это нажатие клавиши.

Полезные ссылки:

Решение: см. мой пост ниже.

4b9b3361

Ответ 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, которые будут устаревать очень быстро. Удачи.