一些桌面应用程序以不同的方式处理“回车”键和数字键盘的“输入”键。我注意到这两个键在 Javascript (jQuery) 中生成相同的 keyCode (13)。
它们在浏览器环境中是否被转换为相等,或者是否可以区分它们(即,让 CR 在文本区域中换行,并且“输入”键提交它的表单?
一些桌面应用程序以不同的方式处理“回车”键和数字键盘的“输入”键。我注意到这两个键在 Javascript (jQuery) 中生成相同的 keyCode (13)。
它们在浏览器环境中是否被转换为相等,或者是否可以区分它们(即,让 CR 在文本区域中换行,并且“输入”键提交它的表单?
请参阅 Jan Wolters 关于Javascript Madness: Keyboard Events的论文。
Enter
并且Numpad Enter
两者都给出相同的键码,即 13,因为浏览器不区分这两个键。老实说,大多数环境也不行。可以使用 Windows API(例如)来区分它们,但这样做确实需要额外的努力。但是,这超出了浏览器抽象的范围。
更新
正如比尔索恩正确提到的那样,该KeyboardEvent
物体location
现在具有财产。
可能的值为:
DOM_KEY_LOCATION_STANDARD
0
该键只有一个版本,或者无法区分该键的左右版本,并且不是在数字小键盘上或被认为是小键盘一部分的键上按下的。
DOM_KEY_LOCATION_LEFT
1
钥匙是钥匙的左手版本;例如,在标准的 101 键美式键盘上按下左侧的 Control 键。此值仅用于在键盘上具有多个可能位置的键。
DOM_KEY_LOCATION_RIGHT
2
钥匙是钥匙的右手版本;例如,在标准的 101 键美式键盘上按下右侧的 Control 键。此值仅用于在键盘上具有多个可能位置的键。
DOM_KEY_LOCATION_NUMPAD
3
该键位于数字小键盘上,或具有与数字小键盘对应的虚拟键代码。注意:当 NumLock 被锁定时,Gecko 总是为数字键盘上的键返回 DOM_KEY_LOCATION_NUMPAD。否则,当 NumLock 解锁并且键盘实际上有一个数字小键盘时,Gecko 也总是返回 DOM_KEY_LOCATION_NUMPAD。另一方面,如果键盘没有小键盘,例如在笔记本电脑上,则某些键只有在 NumLock 被锁定时才会变成小键盘。当此类键触发键事件时,位置属性值取决于键。也就是说,它不能是 DOM_KEY_LOCATION_NUMPAD。注意:NumLock 键的按键事件在 Gecko 和 Internet Explorer 上都指示 DOM_KEY_LOCATION_STANDARD。
如果键盘上有一个物理上不同的键,浏览器应用程序应该与桌面应用程序一样能够区分。
在 Chrome (39.0.2171.95 m)、Firefox (32.0.3)、IE (11.0.9600.17501) 和 Opera (12.17) 的最新版本中,键盘事件对象现在具有位置属性。我想这个属性已经存在了一段时间,尽管它的文档很少。
onkeydown 的测试表明,当按下“正常”回车键时,keyCode=13 和 location=0;当按下小键盘输入时,keyCode=13 和 location=3。
所以下面的代码可以用来设置key==13 if enter, key==176 if numpad enter:
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.keyCode
已KeyBoardEvent.charCode
弃用且不应再使用。
KeyboardEvent
可以根据需要通过访问KeyboardEvent.key
、 KeyboardEvent.code
和KeyboardEvent.location
属性来确定键。
KeyboardEvent.key
通常返回您在文本编辑器中看到的输出键和非输出键上的名称(包括区分大小写)。
KeyboardEvent.code
返回键的字符串描述。
KeyboardEvent.location
返回 0 到 3 之间的整数,表示按键所在的键盘区域(分别为标准、左、右和小键盘)。
了解这些属性之间的差异有助于确定最适合您的特定情况的属性。在这个问题的情况下:将为“回车”和“小键盘输入”键event.key
返回相同的输出 ( ),而将分别返回和。"Enter"
event.code
"Enter"
"NumpadEnter"
在这种情况下,如果您想区分小键盘和键盘键,您可以使用event.code
. 如果您希望它们的操作相同,那event.key
将是一个更好的选择。
如果您想区分其他键,例如左右Ctrl
键,您还需要查看event.location
属性。
我正在添加一个小型键盘事件游乐场,以查看这些事件属性之间的区别。感谢 MDN提供了我在下面仅稍作修改的概念:
window.addEventListener("keydown", function(event) {
let str = "key = '" + event.key +
"'   code = '" + event.code + "'" +
"'   location = '" + event.location + "'" ;
let el = document.createElement("span");
el.innerHTML = str + "<br/>";
document.getElementById("output").appendChild(el);
}, true);
#output {
font-family: Arial, Helvetica, sans-serif;
overflow-y: auto;
margin-left: 4em
}
#output span {
line-height: 2em;
}
#output :nth-child(2n) {
color: blue;
}
<!-- Learn about this code on MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code -->
<p>
Press keys on the keyboard to see what the KeyboardEvent's key and code values are for each one.
</p>
<div id="output"></div>
code
您可以通过事件的属性来区分两者。对于小键盘的一个,它返回NumpadEnter
,而另一个它返回Enter
。或者,您也可以使用location
在所有情况下都有效的属性,这与code
属性不同。对于 numpad Enter,它返回 3,而对于其他 Enter,它返回 0。