【问题标题】:keyCode values for numeric keypad?数字键盘的keyCode值?
【发布时间】:2025-12-26 13:45:12
【问题描述】:

数字小键盘上的数字是否与键盘顶部的数字不同?

下面是一些应该在 keyup 事件上运行的 JavaScript,但前提是 keycode 介于 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 值,但我如何找出它们是什么?

【问题讨论】:

  • 您可以提醒/记录 e.keyCode 并给自己答案。
  • 这里是键盘上每个键的指南help.adobe.com/en_US/AS2LCR/Flash_10.0/…
  • 它们 (e.keyCode) 对于 keyupkeydown 是不同的,因为这些事件与物理键相关并且这些键是不同的。如果您使用 keypress 中的 e.which,您将获得两个键的相同值。
  • 所有键码参考(带演示):codeforeach.com/javascript/…

标签: javascript jquery web-applications numeric-keypad


【解决方案1】:

键码不同。键盘 0-9 是键码 96105

您的if 声明应该是:

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

这是reference guide for keycodes


-- 更新--

这是一个旧答案,keyCode 已被弃用。现在有替代方法可以实现这一点,例如使用key

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

这是output tester for event.key,感谢@Danziger 提供链接。

【讨论】:

【解决方案2】:

************************ 不要使用 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。
  • 我们可能要注意键盘语言布局的另一件事。一些键盘布局将默认数字键更改为符号。
  • 干得好@AlmasDusal。测试也可以变成 if ( parseInt(e.key) >= 0 ) ...
【解决方案3】:

你可以简单地运行

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

在浏览器控制台中查看按键的代码。

或者您可以在这里找到关键代码:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Numpad_keys

【讨论】:

  • 如果您使用没有数字小键盘的键盘,此答案可能没有用
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    对于需要 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;
        }
    

    它使用第一个答案的逻辑。

    【讨论】:

      【解决方案6】:

      要添加到其他一些答案,请注意:

      • keyupkeydown differ from keypress
      • 如果您想使用String.fromCharCode()keyup 中获取实际数字,您需要先对keyCode 进行规范化。

      以下是一个自记录示例,用于确定键是否为数字,以及它是哪个数字(示例使用 range function from 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。
      • 或者,在你的答案被理解后:String.fromCharCode( (e.which &gt; 95 &amp;&amp; e.which &lt; 107 ? e.which - 48 : e.which )).match(/\d/);
      【解决方案7】:

      是的,它们是不同的,虽然很多人都提出了使用 console.log 亲自查看的好建议。但是,我没有看到有人提到 event.location,您可以使用它来确定数字是否来自键盘 event.location === 3 与主键盘顶部/通用键 event.location === 0。当您通常需要确定击键是否来自键盘区域时,这种方法最适合,event.key 可能更适合特定键。

      【讨论】:

        【解决方案8】:

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

        事件代码

        区分数字键盘。

        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
              }
           }
        }
        

        【讨论】:

          【解决方案9】:

          文档说onkeyxxx事件相关的事件顺序:

          1. onkeydown
          2. 按键操作
          3. 开键

          如果您使用如下代码,它也适合退格并输入用户交互。在你可以在 onKeyPress 或 onKeyUp 事件中做你想做的事之后。 代码块触发 event.preventDefault 函数,如果值不是数字,退格或回车。

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

          【讨论】:

            【解决方案10】:

            @.A 的回答。我发现Morel 是最易于理解且占用空间小的解决方案。如果您想要更小的代码量,只是想在顶部添加此解决方案,它是对 Morel 的修改,适用于不允许任何类型的字母,包括输入臭名昭著的“e”字符。

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

            【讨论】:

              【解决方案11】:

              一点点清除@A.Morel 的答案。您可能要注意键盘语言布局。一些键盘布局将默认数字键更改为符号。

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

              【讨论】:

              • 或者只是:console.log( parseInt(e.key) >= 0 ? "is numeric" : "is not numeric" )
              【解决方案12】:

              您可以使用它轻松找出 keyCodes:

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

              http://jsfiddle.net/vecvc4fr/

              【讨论】:

                最近更新 更多