Определить раскладку клавиатуры с помощью JavaScript
Есть ли способ определить текущую раскладку клавиатуры с помощью JavaScript? Я нашел это, но он только обнаруживает, если посетитель находится на английском макете. Мне нужно знать точный макет в виде строки, напримерde-ch
, fr
или же en
,
6 ответов
Раскладки клавиатуры не имеют стандартизированных идентификаторов. У них есть имена, присвоенные им создателем макета. Они могут иметь языковую ассоциацию как одно определенное свойство.
Раскладки клавиатуры не следует путать с идентификаторами языка или локали. В частности, нет единого "английского макета", но десятки макетов, которые могут быть использованы для английского языка.
Я не думаю, что системы обычно делают свои текущие настройки макета удобочитаемыми через JavaScript.
Поэтому любую проблему, которую вы пытаетесь решить, определяя раскладку клавиатуры, необходим другой подход.
Я знаю, что этот вопрос старый, но для тех из вас, кто был в тупике из-за того, что некоторые ключи отображаются на разные символы в других локалях, есть подход, который вы можете использовать для решения этой проблемы.
Скорее всего, ваш обработчик событий клавиатуры привязан к событию keyup или keydown; результаты свойства event.which или event.keyCode в этом случае связаны с тем, какая клавиша нажата пользователем. Например, тот же ключ, который вы используете для ввода ';' в раскладке EN - ключ, используемый для ввода "ж" в раскладке RU, и событие сообщает 186 как код для них обоих.
Однако, если вас больше интересует символ, полученный в результате нажатия клавиши, вам следует использовать событие "нажатие клавиши". Это событие срабатывает после нажатия клавиши / вверх и сообщает о фактической кодовой точке Unicode символа, который был введен внутри event.which или event.charCode, который в приведенном выше примере является десятичным 1078 или U+0436.
Поэтому, если вы предпочитаете не угадывать раскладки клавиатуры и вам не нужно проводить различие между нажатиями клавиш / нажатиями клавиш, нажатие клавиш может быть жизнеспособной альтернативой для вас. Он не идеален (большинство браузеров не всегда сообщают о событиях нажатия клавиш на клавишах, которые не печатают символы, такие как клавиши-модификаторы, функциональные клавиши и клавиши навигации), но это лучше, чем угадывать коды клавиш при работе с печатными символами.
Теперь вы можете использовать объект Keyboard, возвращаемый интерфейсом Navigator. Этот объект обеспечивает доступ к функциям, которые получают карты раскладки клавиатуры и переключают захват нажатий клавиш с физической клавиатуры.
См. Https://developer.mozilla.org/en-US/docs/Web/API/Keyboard.
На данный момент эта функция является экспериментальной и работает только в некоторых основных браузерах.
Все, что я знаю об этой теме и уже реализовал решение для нее, - это обнаружение не английской раскладки клавиатуры, то есть языков, которые используют любой алфавит, кроме того, который используется в английском. Решение зависит от регулярного выражения, чтобы соответствовать любой символ слова \w
любой символ \d
и ряд предопределенных английских специальных символов клавиатуры, поэтому любые другие символы, такие как арабский, японский и т. д., не будут совпадать, все это использует событие нажатия клавиш, и я использую это решение, чтобы ограничить и уведомить ввод полей имени пользователя и пароля в форме входа, Я упаковал его в функцию, подобную следующей:
function checkKeyboard(ob,e){
re = /\d|\w|[\.\$@\*\\\/\+\-\^\!\(\)\[\]\~\%\&\=\?\>\<\{\}\"\'\,\:\;\_]/g;
a = e.key.match(re);
if (a == null){
alert('Error 2:\nNon English keyboard layout is detected!\nSet the keyboard layout to English and try to fill out the field again.');
ob.val('');
return false;
}
return true;
}
Затем вызовите функцию из события следующим образом:
$("#textFieldId").keydown(function(e){
if (!checkKeyboard($(this),e)){
return false;
}
});
Это рабочая ДЕМО для неизвестных павших избирателей!
Вы ищете, как определить их локаль. В заголовках HTTP это хранится в заголовке Accept-Language, но недоступно для браузера через чистый JS.
Существует плагин jQuery под названием " Язык браузера", который поможет вам выбрать правильный путь.
Вы можете использовать event.code для определения фактического положения клавиш из любого макета, попробуйте http://keycode.info/