如何区分';输入';和';返回';Javascript中的键?

如何区分';输入';和';返回';Javascript中的键?,javascript,keycode,Javascript,Keycode,一些桌面应用程序对“回车”键和numpad的“回车”键的处理方式有所不同。我注意到这两个键在Javascript(jQuery)中生成相同的键代码(13) 它们在浏览器环境中是否转换为相等,或者是否可以区分它们(即,使CR在文本区域中生成新行,并按“回车”键提交表单?参见Jan Wolters的论文 Enter和Numpad-Enter都给出相同的键码,即13,因为浏览器不区分这两个键。老实说,大多数环境也不区分。使用Windows API可以区分它们(例如),但这确实需要额外的努力。然而,这超

一些桌面应用程序对“回车”键和numpad的“回车”键的处理方式有所不同。我注意到这两个键在Javascript(jQuery)中生成相同的键代码(13)


它们在浏览器环境中是否转换为相等,或者是否可以区分它们(即,使CR在文本区域中生成新行,并按“回车”键提交表单?

参见Jan Wolters的论文

Enter
Numpad-Enter
都给出相同的键码,即13,因为浏览器不区分这两个键。老实说,大多数环境也不区分。使用Windows API可以区分它们(例如),但这确实需要额外的努力。然而,这超出了浏览器的抽象范围

更新

正如比尔·索恩(Bill Thorne)所说的那样,
KeyboardEvent
对象现在具有
位置
属性

从:

可能的值为:

DOM\u KEY\u LOCATION\u标准
0
该键具有 只有一个版本,或者无法区分左右 键的版本,并且未按数字键盘或 被认为是小键盘一部分的按键

DOM\u KEY\u LOCATION\u LEFT
1
该键是该键的左手版本; 例如,在标准101上按下了左侧控制键 键US键盘。此值仅用于具有超过 键盘上的一个可能位置

DOM\u KEY\u LOCATION\u RIGHT
2
密钥是密钥的右侧版本;例如,右侧 在标准101键美国键盘上按下控制键。此值 仅用于在上具有多个可能位置的键 键盘

DOM\u KEY\u LOCATION\u NUMPAD
3
钥匙在数字键盘上 键盘,或具有与数字键对应的虚拟键代码 键盘

注意:当NumLock被锁定时,Gecko总是返回 数字键盘上键的DOM\u KEY\u LOCATION\u NUMPAD。否则, 当NumLock解锁且键盘实际有一个数字 小键盘上,壁虎总是返回DOM\u KEY\u LOCATION\u NUMPAD。另一方面 手,如果键盘没有键盘,比如笔记本电脑上的键盘 在计算机上,只有当NumLock被锁定时,某些键才会变成Numpad。当 此类键触发键事件,位置属性值取决于 密钥。也就是说,它不能是DOM\u key\u LOCATION\u NUMPAD。注意: NumLock key的key事件指示DOM_key_位置_标准 壁虎和Internet Explorer


如果键盘上有一个键在物理上不同,浏览器应用程序应该和桌面应用程序一样能够区分

随着Chrome(39.0.2171.95 m)、Firefox(32.0.3)、IE(11.0.9600.17501)和Opera(12.17)的最新版本的出现,键盘事件对象现在有了location属性。我想这个属性已经存在了一段时间了,尽管很少有文档记录

onkeydown测试显示,当按下“正常”enter键时,keyCode=13,location=0;当按下numpad enter键时,keyCode=13,location=3

因此,以下代码可用于设置key==13(如果回车),key==176(如果numpad回车):

window.onkeydown=function(ev)
{
    var e= ev || window.event,
      key = e.keyCode || e.which;

    if ((key==13) &&
        (e.location===3))
      key=176; // 176 is the scancode for the numpad enter
    // continued....
}

我提供了一个更新,因为这个问题仍然出现在谷歌搜索结果的顶部附近

根据MDN,和已弃用,不应再使用

KeyboardEvent
键可以根据需要通过访问、和属性来确定

KeyboardEvent.key
通常返回您在文本编辑器中看到的输出键和非输出键的名称(包括区分大小写)

KeyboardEvent.code
返回密钥的字符串描述

KeyboardEvent.location
返回一个介于0和3之间的整数,表示按键所在的键盘区域(分别为标准、左、右和numpad)

在这些属性之间,可以帮助确定哪一个最适合您的给定情况。在这个问题中:
event.key
将返回相同的输出(
“回车”和“numpad回车”键),而
event.code
将返回
“回车”
分别为“NumpadEnter”

在这种情况下,如果要区分numpad键和键盘键,可以使用
event.code
。如果希望它们的操作相同,
event.key
将是更好的选择

如果要区分其他键,例如左键和右键
Ctrl
键,还需要查看
event.location
属性

我正在添加一个小键盘事件游乐场,以查看这些事件属性之间的差异。我仅对以下内容进行了轻微修改,这要归功于:

window.addEventListener(“按键按下”),函数(事件){
让str=“key=”+event.key+
“'nbsp code='”+event.code+“'”+
“'nbsp location='”+event.location+“”;
设el=document.createElement(“span”);
el.innerHTML=str+“
”; document.getElementById(“输出”).appendChild(el); },对);
#输出{
字体系列:Arial、Helvetica、无衬线字体;
溢出y:自动;
左边距:4em
}
#输出范围{
线高:2米;
}
#输出:第n个子(2n){
颜色:蓝色;
}


按键盘上的键以查看KeyboardEvent的键和代码值。


您可以通过事件的
code
属性来区分两者。对于numpad属性,它返回
NumpadEnter
,对于另一个属性,它返回
NumpadEnter