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

Обнаружить раскладку клавиатуры с помощью javascript

Есть ли способ обнаружить текущую раскладку клавиатуры с помощью JavaScript? Я нашел этот,  но он обнаруживает, что посетитель находится на макете английского языка. Мне нужно знать точное расположение в виде строки, например de-ch, fr или en.

4b9b3361

Ответ 1

В макетах клавиатуры нет стандартизованных идентификаторов. У них есть имена, назначенные им создателем макета. Они могут иметь языковое объединение как одно определенное свойство.

Раскладки клавиатуры не следует путать с языковыми или языковыми идентификаторами. В частности, нет единого "английского макета", но есть десятки макетов, которые можно использовать для английского языка.

Я не думаю, что системы обычно делают свои текущие настройки макета доступными для чтения через JavaScript.

Итак, любая проблема, которую вы пытаетесь решить, обнаруживая раскладку клавиатуры, необходим другой подход.

Ответ 2

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

Скорее всего, у вас есть обработчик событий клавиатуры, привязанный к событию keyup или keydown; результаты события. Свойство event.keyCode в этом случае привязывается к тому ключу, который нажал пользователь. Например, тот же ключ, который вы используете для ввода ';' в макете EN - это ключ, используемый для ввода "ж" в макете RU, а сообщения о событиях 186 - как код для обоих из них.

Однако, если вас больше интересует персонаж, возникший в результате нажатия клавиши, вы должны использовать событие "keypress". Это событие срабатывает после keydown/up, и оно сообщает фактический код кодировки unicode символа, который был введен внутри event.which или event.charCode, который в приведенном выше примере является десятичным числом 1078 или U + 0436.

Итак, если вы предпочитаете не угадывать раскладки клавиатуры, и вам не нужно различать keyup/keydown, нажатие клавиши может быть жизнеспособной альтернативой для вас. Он не идеален (большинство браузеров не сообщают о событиях нажатия клавиш на клавишах, которые не печатают символы, такие как ключи-модификаторы, функциональные клавиши и клавиши навигации), но это лучше, чем гадание на кодах клавиш при работе с печатными символами.

Ответ 3

Вы ищете, как определить их локаль. В заголовках HTTP это хранится в заголовке Accept-Language, но это не доступно для браузера через чистую JS.

Там есть плагин jQuery, называемый Язык браузера, который может заставить вас идти по правильному пути.

Ответ 4

Все, что я знаю об этой теме и уже реализовало для нее решение, заключается в обнаружении не английской макетной клавиатуры, i.e Языки, которые используют любой алфавит, отличный от английского,. Решение зависит от регулярного выражения для соответствия любому символу слова \w, любому символу цифры \d и диапазону предопределенных специальных символов английской клавиатуры, поэтому любые другие символы, такие как арабский, японский и т.д., Не будут совпадать, все это использует событие keydown, и я использую это решение, чтобы ограничивать и уведомлять имена пользователей и паролей в форме входа. Я упаковал его в функцию, подобную следующей:

function checkKeyboard(ob,e){
        re = /\d|\w|[\.\[email protected]\*\\\/\+\-\^\!\(\)\[\]\~\%\&\=\?\>\<\{\}\"\'\,\:\;\_]/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;
        }
    });