Javascript .keyCode vs..which

Javascript .keyCode vs..which,javascript,jquery,Javascript,Jquery,我以为这会在堆栈溢出的某个地方得到回答,但我找不到它 如果我正在监听按键事件,我应该使用.keyCode或。哪个来确定是否按下了回车键 我一直在做以下事情: $("#someid").keypress(function(e) { if (e.keyCode === 13) { e.preventDefault(); // do something } }); 但我看到的例子是使用.which而不是.keyCode。有什么区别?一个浏览器比另一个浏览器更友好吗?注意:下面

我以为这会在堆栈溢出的某个地方得到回答,但我找不到它

如果我正在监听按键事件,我应该使用
.keyCode
。哪个
来确定是否按下了回车键

我一直在做以下事情:

$("#someid").keypress(function(e) {
  if (e.keyCode === 13) {
    e.preventDefault();
    // do something
  }
});

但我看到的例子是使用
.which
而不是
.keyCode
。有什么区别?一个浏览器比另一个浏览器更友好吗?

注意:下面的答案是在2010年写的。许多年后,在这里,和都被弃用,取而代之的是(对于逻辑键)和(对于键的物理位置)。但是请注意,IE不支持
code
,它对
key
的支持基于较旧版本的规范,因此不太正确。在我写这篇文章的时候,当前基于EdgeHTML和Chakra的Edge也不支持
code
,但微软正在推出其基于和的Edge替代品,这大概是/将是这样


一些浏览器使用
keyCode
,另一些浏览器使用
其中的

如果您使用的是jQuery,那么就可以可靠地使用
which
作为jQuery

如果不使用jQuery,可以执行以下操作:

var key = 'which' in e ? e.which : e.keyCode;
或者:

var key = e.which || e.keyCode || 0;

…它处理
e.which
可能是
0
(通过在最后使用还原
0
)的可能性。

jQuery将
事件正常化。这取决于
事件。which
事件.keyCode
事件。浏览器支持charCode

// Add which for key events
if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
   event.which = event.charCode != null ? event.charCode : event.keyCode;
}
的另一个好处是,jQuery也可以通过鼠标点击来实现:

// Add which for click: 1 === left; 2 === middle; 3 === right
// Note: button is not normalized, so don't use it
if ( !event.which && event.button !== undefined ) {
    event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
}
看看这个:

在keypress事件中,按下的键的Unicode值存储在keyCode或charCode属性中,而不是存储在两者中。如果按下的键生成一个字符(例如“a”),则charCode设置为该字符的代码,与字母大小写有关。(即charCode考虑是否按下shift键)。否则,按键的代码将存储在keyCode中。 keyCode始终在keydown和keyup事件中设置。在这些情况下,永远不会设置charCode。 要获取密钥的代码,不管它是存储在keyCode还是charCode中,请查询which属性。
通过IME输入的字符不会通过keyCode或charCode注册。

一个强大的Javascript库,用于捕获键盘输入和输入的组合键。它没有依赖性

热键理解以下修饰符:
移位
选项
alt
ctrl
控制
命令
,以及


以下特殊键可用于快捷方式:
backspace
选项卡
清除
输入
返回
退出
空格
向上
向下
主页
结束
pageup
pagedown
del
delete
f1
,通过
f19
,如果您使用的是香草Javascript,请注意,keyCode现在已被弃用,将被删除:

此功能已从Web标准中删除。尽管某些浏览器可能仍然支持它,但它正在被删除。避免使用,并尽可能更新现有代码;请参阅本页底部的兼容性表以指导您的决策。请注意,此功能可能随时停止工作

而是根据您想要的行为使用:.key.code


这两个都是在现代浏览器上实现的。

我建议现在使用
event.key
。MDN文档:

event.KeyCode
event.which
在其MDN页面的顶部都有令人讨厌的不推荐的警告:

对于字母数字键,
event.key
似乎在所有浏览器中都以相同的方式实现。对于控制键(tab、enter、escape等),
event.key
在Chrome/FF/Safari/Opera中具有相同的值,但在IE10/11/Edge中具有不同的值(IEs显然使用较旧版本的规范,但自2018年1月14日起相互匹配)

对于字母数字键,检查类似于:

event.key === 'a'
event.key === 'Esc' || event.key === 'Escape'
对于控制字符,您需要执行以下操作:

event.key === 'a'
event.key === 'Esc' || event.key === 'Escape'
我使用这里的示例在多个浏览器上进行测试(我必须在codepen中打开并进行编辑,以使其与IE10协同工作):


event.code
可能在另一个答案中提到,但IE10/11/Edge没有实现它,因此如果您需要IE支持,它就不存在了。

在Firefox中,keyCode属性在onkeypress事件中不起作用(只返回0)。对于跨浏览器解决方案,请将which属性与keyCode一起使用,例如:

var x = event.which || event.keyCode;  // Use either which or keyCode, depending on browser support

谢谢T.J.我在哪里可以找到这方面的参考资料?并不是说我不相信你,我只是好奇而已。。。我看到你刚刚加了这个,谢谢。所以,即使对于那些不使用jquery的人来说,。哪一个是更好的选择?@ScottE:如果不使用jquery,你必须自己明确地处理这个问题。我通常这样做
var key=event.which | | event.keyCode
将使用
event.which
(如果已定义且没有错误),或者
event.keyCode
如果
which
未定义或错误。从技术上讲,我可能应该做
var key=typeof event.which==“undefined”?event.keyCode:event.which
但是如果
event.which
0
(它可能是
0
?),我不太可能关心我所做的事情。@ScottE,这里有一个基本的参考:(它不包括
,我认为它只由jQuery提供,但我不是100%确定,但它应该让你开始了解浏览器中的差异)@fudgey:
键提供了哪个