keyCode数字键盘的值?


76

数字小键盘上的数字是否具有与键盘顶部的数字不同的键控代码?

这是应该在keyup事件上运行的一些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并给自己答案。
Andreas Eriksson

下面是键盘上的每个按键引导help.adobe.com/en_US/AS2LCR/Flash_10.0/...
Raghurocks

1
它们(e.keyCode)的用途不同keyupkeydown因为这些事件与物理键有关,而这些键也不同。如果使用e.whichfrom keypress,则两个键都将获得相同的值。
ROMANIA_engineer 2015年

1
参考所有的键码(有示范):codeforeach.com/javascript/...
普拉香特

Answers:


163

密钥代码不同。键盘0-9是个人识别号码96105

您的if声明应为:

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

这是键码参考指南


9
要注意的是,这与jQuery的.keypress()事件有所不同,该事件报告数字48-57,无论它们来自键盘还是小键盘。
Noumenon

1
参考所有的键码(有示范):codeforeach.com/javascript/...
普拉香特

您应该在keyDown事件中使用KeyValue而不是keyCode
reyhane

@reyhane 1)这里的逻辑是使用keyupnot keydown。2)keyValuejQuery事件中没有属性。
罗里·麦克罗森

1
1+这里也是关键代码blogs.longwin.com.tw/lifetype/key_codes.html 并在此处进行了演示测试speedysense.com/javascript-keyboard-event keypress事件。
杰·帕特尔

15

*******************不要使用KEYCODE !!!! ******************

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为null空格,则它为0

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

我们可以使用parseInt,但Number除外,当它为空格或为null时会返回NaN。
Almas Dusal

我们可能还要提防键盘语言布局的另一件事。某些键盘布局将默认数字键更改为符号。
Almas Dusal



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);

这个答案解决了我的问题;由于某些原因,小键盘2的keyCode在使用String.fromCharCode()时给出值b。
Cyntech

或者,在您的答案被理解之后:String.fromCharCode( (e.which > 95 && e.which < 107 ? e.which - 48 : e.which )).match(/\d/);
user1944491 '20

1

您可以使用键码页面来查找:

事件代码

区别数字键盘。

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的答案。我发现羊肚菌是占地面积小,最易理解的最佳解决方案。如果您想减少代码量,只需在顶部添加此解决方案,它是对Morel的修改,非常适合不允许包含输入臭名昭著的“ e”字符的任何形式的字母。

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

0

Docs说与onkeyxxx事件相关的事件顺序:

  1. 按键
  2. 按键
  3. 按键

如果您使用类似下面的代码,则它也适合退格并输入用户交互。之后,您可以在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")
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.