Получить правильный код для клавиш клавиатуры (цифровой клавиатуры)

Я получаю коды клавиш от 96 до 105 при нажатии клавиш на клавиатуре [0..9] Эти коды клавиш соответствуют символам: "a b c d e f g h i" вместо "0 1 2 3 4 5 6 7 8 9" при вызове String.fromCharCode(event.keyCode).

Вопрос:
У меня есть 3 ввода [type='text'], когда пользователь нажимает клавиши при первом вводе

 if(this key is numeric)
  write it to second input
 else if (this key is alpha)
  write it to third input

Но это дает "а", когда я нажимаю 1 из цифровой клавиатуры. Как я могу решить это?

вот мой код

5 ответов

Решение

Использовать keypress обработчик:

[somelement].onkeypress = function(e){
  e = e || event;
  console.log(String.fromCharCode(e.keyCode));
}

Смотрите также: этот тестовый документ W3C

если вы хотите использовать keyup или же keydown обработчик, вы можете вычесть 48 из e.keyCode чтобы получить номер (так String.fromCharCode(e.keyCode-48))

Я исправил проблему, используя следующий код JavaScript. Цифровые клавиши находятся в диапазоне от 96 до 105. Но действительные числа меньше 48 от числовых значений. Работает с keyup или keydown обработчиком.

    var keyCode = e.keyCode || e.which;
    if (keyCode >= 96 && keyCode <= 105) {
        // Numpad keys
        keyCode -= 48;
    }
    var number = String.fromCharCode(keyCode);

Есть способ сделать это с помощью keydown, если нажатие клавиши не работает из-за необходимости отмены события и т. Д. Используйте оператор if() в этом тесте:

parseInt(event.keyIdentifier.substring(2),16) > 47 && parseInt(event.keyIdentifier.substring(2),16) < 58

ИЛИ с событиями jQuery:

parseInt(event.originalEvent.keyIdentifier.substring(2),16) > 47 && parseInt(event.originalEvent.keyIdentifier.substring(2),16) < 58

В этих примерах предполагается, что "событие" является событием keydown. keyIdentifier - шестнадцатеричное число, представляющее значение Юникода для соответствующего символа. Используя keyIdentifier, числа с цифровой клавиатуры / клавиатуры и цифры над клавиатурой QWERTY будут иметь одинаковые значения, 48 - 57 (U+0030 - U+0039), даже с событием keyDown.

Значения Unicode в браузерах будут выглядеть как U + 0030 или U+002F. Разберите эту строку, чтобы получить только шестнадцатеричное значение, затем используйте parseInt() с основанием 16, чтобы преобразовать ее в base-10.

Хорошо. Но в Firfox Gecko это не работает. Я использую приведенный ниже код, и я доволен этим:)

[somelement].onkeypress = function(e){
  var singleChar=e.key || String.fromCharCode(e.keyCode);
  console.log(singleChar);
}

event.charCode в onKeyPress возвращает тот же код при нажатии цифры на клавиатуре и клавиатуре. но event.keyCode в onKeyDown (или выше) возвращает другой код. => получить char: использовать event.charCode в событии onKeyPress. event.preventDefault() (или event.returnValue=false в IE) для числа использовать event.keyCode в событии onKeyDown.

Я думаю, что более безопасный способ - не использовать ключи значений, которые будут использоваться. Вы можете получить рабочее значение с помощью объекта KeyboardEvent и получить доступ к его свойствам "DOM_VK_*". Позвольте привести пример.

 const kcN0=KeyboardEvent.DOM_VK_0;//get the 0 key value (commonly,48)
 const kcN9=KeyboardEvent.DOM_VK_9;//get the 9 key value (commonly, 57)
 const kcNPad0=KeyboardEvent.DOM_VK_NUMPAD0;//get the NUMPAD 0 key value (commonly,96)
 const kcNPad9=KeyboardEvent.DOM_VK_NUMPAD9;//get the NUMPAD 9 key value (commonly,105)
 const kcNPad_L=KeyboardEvent.DOM_KEY_LOCATION_NUMPAD;//get the key location of NUMPAD (commonly, 3)

и вычислить переменную события "kbEv"

let pressKeyCode=(kbEv.which||kbEv.keyCode); if( kbEv.location===kcNPad_L && pressKeyCode>=kcNumP0 && pressKeyCode<=kcNumP9 ) pressKeyCode=kcN0+kcNPad9-pressKeyCode;

Я только предположил, что от 0 до 9 будут последовательными в этих двух непересекающихся наборах числовых цифр.

Другие вопросы по тегам