Значення keyCode для цифрової клавіатури?


77

Чи мають цифри на цифровій клавіатурі інший код клавіатури, ніж цифри у верхній частині клавіатури?

Ось деякий JavaScript, який повинен працювати під час події клавіатури, але лише якщо код ключа між 48 і 57. Ось код:

$('#rollNum').keyup(function(e) {
    if(e.keyCode >= 48 && e.keyCode <= 57) { //0-9 only
        var max = 15;
        var textLen = $(this).val().length;
        var textLeft = max - textLen;
        . . . 

Моя проблема полягає в тому, що цей код працює лише у відповідь на цифри, введені у верхній частині клавіатури, але не працює у відповідь на цифри, введені з цифрової клавіатури.

Я думаю, що відповідь повинна полягати в тому, що числова клавіатура має різні значення keyCode, але як мені дізнатися, що це?


9
Ви можете просто попередити / увійти e.keyCode і дати собі відповідь.
Андреас Ерікссон,

Ось посібник для кожної клавіші на клавіатурі help.adobe.com/en_US/AS2LCR/Flash_10.0/…
Raghurocks

1
Вони ( e.keyCode) відрізняються для keyupі keydownтому, що ці події пов'язані з фізичними ключами, а ці ключі різні. Якщо ви використовуєте e.whichвід keypress, ви отримаєте однакові значення для обох ключів.
ROMANIA_engineer

1
Посилання на всі коди клавіш (з демонстрацією): codeforeach.com/javascript/…
Прашант,

Відповіді:


163

Коди клавіш різні. Клавіатура 0-9 є Keycode 96в105

Ваше ifтвердження повинно бути:

if ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) { 
    // 0-9 only
}

Ось довідковий посібник для кодів клавіш


9
Хотів зазначити, що це інше у події .keypress () jQuery, яка повідомляє про цифри 48-57, незалежно від того, клавіатура чи цифрова панель.
Noumenon

1
Посилання на всі коди клавіш (з демонстрацією): codeforeach.com/javascript/…
Прашант,

вам слід використовувати KeyValue замість keyCode у події
keyDown

@reyhane 1) логіка тут використовується keyup, а не keydown. 2) У keyValueподії jQuery немає властивості.
Rory McCrossan

1
1+ тут ​​також ключовий код blogs.longwin.com.tw/lifetype/key_codes.html та демонстраційний тест тут speedysense.com/javascript-keyboard-event подія натискання клавіші.
Джей Патель,

15

******************* Не використовуйте КЛЮЧОВИЙ КОД !!!! ******************

Проблема з keyCode полягає у тому, щоб уникнути комбінованих клавіш із цифрами у верхній частині клавіатури, ми повинні додати галочку на клавіші "Shift" та "Alt", щоб уникнути спеціальних символів, таких як e @ & "{} ...

Найпростішим рішенням є перетворення e.key в число і перевірка, чи перетворення дає NaN !

let key = Number(e.key)
if (isNaN(key) || e.key === null || e.key === ' ') {
  console.log("is not numeric")
}
else {
  console.log("is numeric")
}

Будьте обережні, якщо e.key нульовий або пробіл , це дає 0 !

Number(5)         // => 5
Number('5')       // => 5
Number(null)      // => 0 
Number(' ')       // => 0
Number('chars')   // => NaN
Number(undefined) // => NaN

Ми можемо використовувати parseInt, крім Number, тоді він отримує NaN, коли він пробіл або null.
Almas Dusal

Ще одне, що ми можемо остерігатися розкладки мови клавіатури. Деякі розкладки клавіатури змінювали цифрові клавіші за замовчуванням на символи.
Almas Dusal

8

Ви можете просто бігти

$(document).keyup(function(e) {
    console.log(e.keyCode);
});

щоб побачити коди натиснутих клавіш у консолі браузера.

Або ви можете знайти ключові коди тут: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Numpad_keys


15
Ця відповідь може бути корисною, якщо ви використовуєте клавіатуру без цифрової клавіатури
R Brill

6

keyCode відрізняється для чисел на цифровій клавіатурі та чисел у верхній частині клавіатури.

коди ключів:

цифри вгорі на клавіатурі (0 - 9): 48 - 57
цифр на цифровій клавіатурі (0 - 9): 96 - 105

Умова JavaScript:

if((e.keyCode >= 48 && e.keyCode <=57) || (e.keyCode >= 96 && e.keyCode <=105)) { 
    // entered key is a number
}

Посилання на всі коди клавіш (з демонстрацією): http://www.codeforeach.com/javascript/keycode-for-each-key-and-usage-with-demo


2

Для людей, які хочуть рішення CTRL + C, CTRL-V, ось:

    /**
     * Retrieves the number that was pressed on the keyboard.
     *
     * @param {Event} event The keypress event containing the keyCode.
     * @returns {number|null} a number between 0-9 that was pressed. Returns null if there was no numeric key pressed.
     */
    function getNumberFromKeyEvent(event) {
        if (event.keyCode >= 96 && event.keyCode <= 105) {
            return event.keyCode - 96;
        } else if (event.keyCode >= 48 && event.keyCode <= 57) {
            return event.keyCode - 48;
        }
        return null;
    }

Він використовує логіку першої відповіді.


2

Щоб додати до деяких інших відповідей, зверніть увагу, що:

  • keyupі keydown відрізняються відkeypress
  • якщо ви хочете використовувати String.fromCharCode()фактичну цифру keyup, спочатку потрібно нормалізувати keyCode.

Нижче наведено приклад самодокументування, який визначає, чи є ключ цифровим, поряд із яким номером це (приклад використовує rangeфункцію відlodash ).

const isKeypad = range(96, 106).includes(keyCode);
const normalizedKeyCode = isKeypad ? keyCode - 48 : keyCode;
const isDigit = range(48, 58).includes(normalizedKeyCode);
const digit = String.fromCharCode(normalizedKeyCode);

Ця відповідь вирішила мою проблему; чомусь keyCode для numpad 2 давав значення b при використанні String.fromCharCode ().
Cyntech,

Або після того, як ваша відповідь зрозуміла:String.fromCharCode( (e.which > 95 && e.which < 107 ? e.which - 48 : e.which )).match(/\d/);
user1944491

1

Ви можете використовувати кодову сторінку ключа, щоб знайти:

event.code

щоб розподілити цифрову клавіатуру.

https://keycode.info/

function getNumberFromKeyEvent(event) {
   if (event.code.indexOf('Numpad') === 0) {
      var number = parseInt(event.code.replace('Numpad', ''), 10);
      if (number >= 0 && number <= 9) {
           // numbers from numeric keyboard
      }
   }
}

1

Так, вони різні, і хоча багато людей зробили чудову пропозицію використовувати console.log, щоб переконатися на власні очі. Однак я не бачив, щоб хтось згадував event.location, за яким ви можете визначити, чи надходить номер з клавіатури event.location === 3проти верхньої частини головної клавіатури / загальних клавіш event.location === 0. Цей підхід найкраще підходить для тих випадків, коли вам потрібно загалом визначити, чи натискання клавіш надходить з певної області клавіатури чи ні, event.keyшвидше за все, краще для конкретних клавіш.


0

Відповідь @ .A. Морель Я вважаю найкращим легко зрозумілим рішенням з невеликим розміром. Просто хотів додати зверху, якщо ви хочете меншу кількість коду, це рішення, яке є модифікацією Мореля, добре працює, не дозволяючи будь-яких літер, включаючи введення горезвісного символу "е".

function InputTypeNumberDissallowAllCharactersExceptNumeric() {
  let key = Number(inputEvent.key);
  return !isNaN(key);
}

0

Документи вказують порядок подій, пов’язаних з подією onkeyxxx:

  1. onkeydown
  2. onkeypress
  3. onkeyup

Якщо ви використовуєте код, як показано нижче, він поєднується із зворотним простором та вводить взаємодію користувачів. Після того, як ви зможете робити те, що хочете, у подіях onKeyPress або onKeyUp. Функція блокування коду event.preventDefault, якщо значення не число, зворотний простір або enter.

onInputKeyDown = event => {
    const { keyCode } = event;
    if (
      (keyCode >= 48 && keyCode <= 57) ||
      (keyCode >= 96 && keyCode <= 105) ||
      keyCode === 8 || //Backspace key
      keyCode === 13   //Enter key
    ) {
    } else {
      event.preventDefault();
    }
  };

0

Трохи очистив відповідь @ A.Morel. Можливо, остерігайтеся розкладки мови клавіатури. Деякі розкладки клавіатури змінювали цифрові клавіші за замовчуванням на символи.

let key = parseInt(e.key)
if (isNaN(key)) {
  console.log("is not numeric")
}
else {
  console.log("is numeric")
}

-2

Ви можете використовувати це, щоб легко зрозуміти коди ключів:

$(document).keyup(function(e) {
    // Displays the keycode of the last pressed key in the body
    $(document.body).html(e.keyCode);
});

http://jsfiddle.net/vecvc4fr/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.