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

Я получаю коды [96..105] при нажатии клавиш на клавиатуре [0..9] Эти коды соответствуют символам: 'abcdefgh i' вместо [0..9] при попытке получить код таким способом. String.fromCharCode(event.keyCode).

Вопрос:

У меня есть 3 ввода в форме. Пользователь может войти только в первый вход. В то время как пользователь нажимает клавиши на клавиатуре, некоторые функции должны фильтровать его и записывать на второй вход, если нажатая клавиша является цифрой, в противном случае она должна записать ее на второй вход. Как это можно исправить? Пожалуйста, смотрите ссылку ниже, поскольку она описывает весь мой поток и коды, которые я реализовал

вот мой код

Ответ 1

Используйте обработчик 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))

Ответ 2

Я исправил проблему, используя следующий код javascript. Клавиши numpad лежат между 96 и 105. но реальные цифры меньше 48 из значений numpad. Работает с обработчиком keyup или keydown.

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

Ответ 3

Существует способ сделать это с помощью keydown, если keypress не работает из-за необходимости отмены событий и т.д. Используйте инструкцию 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 - это шестнадцатеричное число, которое представляет значение unicode для соответствующего char. Используя keyIdentifier, цифры с цифровой клавиатуры и клавиатуры, а числа над клавиатурой QWERTY будут иметь одинаковые значения, 48 - 57 (U + 0030 - U + 0039), даже с событием keyDown.

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Я думаю, что более безопасный способ не предполагает использование ключей значения, которые будут использоваться. Вы можете получить рабочее значение с помощью объекта 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 будет последовательным в этих двух непересекающихся наборах цифровых цифр.