Обработка парного кода с номером клавиатуры Javascript

Я пытаюсь разобрать события keydown с цифровой клавиатуры со следующим:

$('#myDiv').keydown(function(e) {
  val = String.fromCharCode(e.which)
});

Проблема в том, что клавиатура 0-9 возвращает keyCodes 96-105, которая, согласно fromCharCode(), является строчными буквами a-i. Как получить события смены клавиатуры на числовой панели для разрешения соответствующего номера?

Ответ 1

У вас нет: вы используете событие keypress. Событие keypress - это единственное событие, которое даст вам достоверную информацию о типизированных символах. Ваш существующий код будет работать, если вы просто измените keydown на keypress.

Ответ 2

Значение which, переданное в keydown, не является символьным кодом; это key code (и коды меняются от браузера/ОС к браузеру/ОС). Вы можете сопоставить его с символом, используя таблицы на этой странице, но сказать, что этот материал немного... неудобен... будет быть заниженным.: -)

В противном случае лучше всего подождать событие keypress, которое будет иметь код символа (если это необходимо), а не key code.

Пример: Живая копия | Live source

jQuery(function($) {

  $("#theField")
    .keydown(function(event) {
      showKey("keydown", event.which);
    })
    .keypress(function(event) {
      showKey("keypress", event.which);
    })
    .focus();

  function showKey(eventName, which) {
    display(eventName +
            ": " + which + " (" +
            String.fromCharCode(which) + ")");
  }

  function display(msg) {
    $("<p>").html(msg).appendTo(document.body);
  }
});

С помощью этого HTML:

<input type="text" id="theField">

Ответ 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

Ответы здесь устарели, потому что KeyboardEvent.which, KeyboardEvent.keyCode и KeyboardEvent.charCode устарели.

Правильный способ для последних версий Firefox, Chrome, IE/Edge и Safari для получения символьного ключа - использовать KeyboardEvent.key и он должен работать с любым ключевым событием, а не только с keypress.

Совместимость браузера KeyboardEvent.key

document.
  querySelector('input').
  addEventListener('keydown', event => console.log(event.key));
<input placeholder="Start typing...">

Ответ 5

вы можете использовать keydown и обнаруживать клавиши numpad. Я сделал это, используя следующий код. Вычитайте 48 из клавиш numpad перед интерпретацией клавиши

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