Переведите Javascript keyCode в charCode для раскладки клавиатуры за пределами США (например, azerty) - PullRequest
16 голосов
/ 15 марта 2011

Быстрый фон:

  • при нажатии клавиши в браузере генерируются три события: keyDown , keyPress и keyUp .
  • keyDown и keyUp имеют свойство keyCode , которое приблизительно соответствует нажатой физической клавише.
  • keyPress также имеет набор свойств charCode , который учитывает клавиши-модификаторы и раскладку клавиатуры (A и a имеют одинаковый keyCode, но другой charCode).
  • все три события имеют свойства, которыеукажите, какие клавиши-модификаторы были нажаты во время этих событий.

Я являюсь основным noVNC разработчиком и у меня сложная проблема: noVNC требуется переведенный charCode значение без использования события keyPress по следующим причинам:

  • noVNC необходимо отправлять события keyDown и keyUp отдельно на сервер VNC (в противном случае это не полностью функциональный клиент VNC).
  • больше яВо-первых, noVNC должен предотвращать действия клавиатуры по умолчанию при подключении, что означает вызов метода protectDefault () события keyDown .У этого есть побочный эффект, также препятствующий запуску события keyPress .

Из-за различий в раскладках клавиатуры (т. Е. Разных сопоставлений клавиш и кодов), я определил, что noVNCпотребуется таблица поиска для различных раскладок клавиатуры.

Но здесь есть реальная проблема: на альтернативных раскладках, некоторые разные физические клавиши имеют код клавиши SAME .Например, при раскладке клавиатуры azerty (французский язык) клавиши подчеркивания '-' (тире) и '_' генерируют код клавиши 189. Ack !!!

Итак ... какполучить правильное сопоставление keyCode и charCode и одновременно предотвратить действия браузера по умолчанию?

Кстати, я подозреваю, что решение этой проблемы будет применимо к другим интерактивным веб-приложениям и играм HTML5, так как вы часто хотите иметь возможностьзнать полную информацию о нажатой клавише, не вызывая дополнительного ответа браузера на нажатие этой клавиши.

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

Решение : см. Мой рОст ниже.

Ответы [ 2 ]

8 голосов
/ 06 апреля 2011

Я решил свой вопрос. Это не 100% решение, но оно должно покрывать большую часть того, что необходимо. Надеемся, что когда производители браузеров начнут интегрировать DOM Level 3 Events .

, будет более чистое решение.

Просто повторим основные ограничения:

  1. События нажатия клавиш и нажатия клавиш должны сообщаться / отправляться в то время, когда они действительно происходят. То есть отправка клавиши вниз и клавиши вместе во время события keyPress недостаточна.
  2. Многие комбинации клавиш должны быть полностью обработаны во время события keyDown либо потому, что они никогда не вызывают событие keyPress (например, клавиша Ctrl), либо потому, что действие по умолчанию должно быть остановлено в keyDown (WebKit), и это предотвращает возникновение события keyPress.
  3. При нажатии клавиш и событиях клавиш должен сообщаться переведенный код символа, а не значение keyCode.

Без некоторого готового прозрения текущие реализации браузера, по-видимому, не позволяют полностью выполнить все три ограничения. Поэтому я решил немного ослабить ограничение №3.

  • В браузере событие keyDown добавьте событие в список ключей вниз и проверьте, является ли оно безопасной (без нежелательного поведения браузера по умолчанию) комбинацией клавиш:

    • Безопасный : ничего не делать до нажатия клавиши.

    • Небезопасно : немедленно сообщить / отправить событие нажатия клавиши. Здесь ограничение № 3 ослаблено, потому что эти ограниченные комбинации клавиш не переводятся в код символа (хотя многие из них их не имеют).

  • В браузере Событие keyPress (которое происходит сразу после события keyDown) проверяет, является ли оно безопасной комбинацией клавиш:

    • Безопасный : сообщить / отправить событие нажатия клавиши. Обновите список ключей, используя переведенный код символа (event.which).

    • Небезопасно : ничего не делать, поскольку об этом уже было сообщено / отправлено во время keyDown.

  • В браузере keyUp событие, найдите и удалите соответствующее событие из списка нажатия клавиш и используйте переведенный код, чтобы сообщить / отправить событие key up.

Некоторые дополнительные ссылки для интересующих:

3 голосов
/ 15 марта 2011

Это абсолютное минное поле, и я призываю вас не пытаться делать это, если вы можете избежать этого.Не только существует длинная и запутанная история производителей браузеров, не согласных с поведением ключевых событий, но и тот факт, что они все еще не согласны и по-прежнему регулярно меняют поведение своих браузеров.

Следующее - лучшее, что я могу предложить, и исчерпывающий ресурс по ключевым событиям браузера: http://unixpapa.com/js/key.html

Если вам нужно сделать это, я думаю, что у вас будет множество таблиц сопоставления кода ключа, которые будуточень быстро устареваютУдачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...