获取键盘(小键盘)键的正确keyCode

时间:2011-04-12 05:50:12

标签: javascript jquery

按键盘上的键时,我收到代码 [96..105] [0..9] 这些代码对应于字符:'a b c d e f g h i'而不是 [0..9] ,同时尝试以这种方式获取代码String.fromCharCode(event.keyCode).

问题:

我在表单中有3个输入。用户只允许输入第一个输入。当用户按下键盘上的键时,如果按下键是数字,则某些功能需要对其进行过滤并将其写入第二个输入,否则必须将其写入第二个输入。如何纠正?请参阅下面的链接,因为它描述了我实施的所有流程和代码

here is my code

6 个答案:

答案 0 :(得分:59)

使用keypress处理程序:

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

另请参阅:this W3C testdocument

如果您想使用keyupkeydown处理程序,可以从e.keyCode中减去48来获取数字(String.fromCharCode(e.keyCode-48)

答案 1 :(得分:10)

我使用以下javascript代码修复了该问题。小键盘键位于96到105之间。但实际数字小于小键盘值48。与keyup或keydown处理程序一起使用。

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

答案 2 :(得分:4)

有一种方法可以通过keydown执行此操作,如果由于事件取消需要而无法使用keypress等,请使用带有此测试的if()语句:

parseInt(event.keyIdentifier.substring(2),16) > 47 && parseInt(event.keyIdentifier.substring(2),16) < 58

OR,与jQuery事件:

parseInt(event.originalEvent.keyIdentifier.substring(2),16) > 47 && parseInt(event.originalEvent.keyIdentifier.substring(2),16) < 58

这些示例假设“event”是keydown事件。 keyIdentifier是一个十六进制数字,表示相关char的unicode值。使用keyIdentifier,即使使用keyDown事件,数字键盘/键盘上的数字和QWERTY键盘上方的数字都将具有相同的值48 - 57(U + 0030 - U + 0039)。

浏览器中的Unicode值看起来像U + 0030或U + 002F。将此字符串解析为仅获取十六进制值,然后使用基数为16的parseInt()将其转换为base-10。

答案 3 :(得分:2)

确定。但在Firfox Gecko它不起作用。我使用波纹管代码,我很满意:)

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

答案 4 :(得分:0)

在键盘和键盘上按下数字时,onKeyPress上的

event.charCode返回相同的代码。 但onKeyDown(或更高版本)的event.keyCode返回不同​​的代码。 =&GT; get char:在onKeyPress事件中使用event.charCode    event.preventDefault()(或IE上的event.returnValue = false)用于onKeyDown事件的数字使用event.keyCode

答案 5 :(得分:0)

我认为更安全的方法是不假定将使用值键。您可以通过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是连续的。