ОС-независимое событие клавиатуры для сопоставления символов

Очевидно, что веб-приложению необходимо настроить параметры клавиатуры пользователя, верно? Есть ли способ сказать Dojo, что нужно подключиться к реальному событию KeyPress вместо KeyDown, чтобы мы могли получить символ, набранный из event.charCode?

Так как мы живем в международном мире, с несколькими операционными системами, а что нет, этой информации недостаточно, чтобы выяснить, какой символ в действительности набрал пользователь, если у меня нет встроенной в браузер функции для запроса операционной системы.

Например, на немецкой клавиатуре в Linux [достигается через Alt Gr-8, который отправляет клавишу Alt, а затем клавишу [. Хорошо, просто проигнорируй первую часть. В системе Windows с немецкой клавиатурой второе событие для 8 с ctrlKey и altKey, установленными в true. Я не думаю, что код JavaScript должен интерпретироваться жестко, потому что при других настройках клавиатуры эта комбинация клавиш будет фактически означать другой символ.

В качестве другого примера (вероятно, не подключенного к Dojo, а скорее другого программиста, извините за разглагольствование…), с американской клавиатурой на Mac вы не можете набирать немецкий символ ß в веб-интерфейсе outlook - потому что outlook фиктивен (!) перехватывает клавишу alt (которая на mac используется исключительно для изменения набираемых символов) для запуска действий, и, таким образом, alt-s переопределяется для обозначения send. Как правило, в середине слова, конечно.

3 ответа

Решение

Вы можете установить 5 dontFix аргумент передан dojo.connect() в true, что говорит о том, что он должен проходить как есть без специальной обработки. Смотрите https://github.com/dojo/dojo/blob/master/_base/connect.js#L32

event.charCode содержит символ, полученный при нажатии клавиатуры, а не фактическую нажатую клавишу.

https://developer.mozilla.org/en/DOM/event.charCode

В случае нажатия клавиши значение Unicode нажатой клавиши сохраняется в свойстве keyCode или charCode, но не в обоих. Если нажатая клавиша генерирует символ (например, "a"), charCode устанавливается на код этого символа, с учетом регистра букв

edit: также см. https://developer.mozilla.org/en/Gecko_Keypress_Event, в нем содержится более проницательное объяснение того, как работает charCode (особенно в Gecko, но некоторые из них применимы и к другим браузерам). Вы можете найти это интересным:

... когда текущая выбранная раскладка клавиатуры создает символ Unicode (в соответствии с текущим состоянием CapsLock и NumLock), свойство charCode содержит этот символ

Использовать keypress событие, целью которого является дать вам информацию о персонаже, набранном пользователем. Вам понадобится (причудливо) keyCode собственность в IE а which свойство в других браузерах; они дают вам набранный код символа.

Полная страница для ключевых событий JavaScript: http://unixpapa.com/js/key.html

document.onkeypress = function(e) {
    e = e || window.event;
    var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
    alert(String.fromCharCode(charCode));
};
Другие вопросы по тегам