event.keycode vs event.which

cod*_*ppy 19 javascript jquery event-handling javascript-events

忽略了Firefox的keydown行为,因为按下回车键(实际上是任何键)而没有专注于特定字段将不会触发keydown事件,它只会触发按键事件.

这可能非常令人困惑,因为keydownkeyup事件使用JavaScript密钥代码,而keypress使用ASCII代码.幸运的是,13(输入/返回)对两者都很常见.

在这种情况下,使用按键的 FF有什么原因吗?有什么好处?

一旦确定,IE8就会愚蠢,因为它不允许preventDefault要求,而returnValue = false另一个SO帖子的以下片段证明非常有用:

event.preventDefault ? event.preventDefault() : event.returnValue = false;
Run Code Online (Sandbox Code Playgroud)

在搜索解决这些问题的过程中,我一直event.keycode对vs 感到困惑event.which.即我使用类似于以下的switch语句做错了:

$("#class_Name").bind("keydown", function(event){
    // do not test input if field controls used
    switch(event.which){
       case 13:
       //enter key 
       event.preventDefault ? event.preventDefault() : event.returnValue = false;
       break;
     }
Run Code Online (Sandbox Code Playgroud)


以下是更好的,如果是这样,为什么?

$("body").keypress(function(event){
     // stop inadvertant form submission
     if (event.keycode == "13"){
       event.preventDefault ? event.preventDefault() : event.returnValue = false;
     }
});
Run Code Online (Sandbox Code Playgroud)


我想知道,以便我知道最适合哪种方式.

非常感谢.

sQV*_*QVe 10

一些浏览器使用keyCode和其他人使用which.但是使用jQuery,这是标准化的,所以你不必考虑这一点.你可以选择你喜欢的那个.

  • 仅适用于事件由jquery本身生成的情况.捕捉原生事件并使其正常化是不可能的 (3认同)

Cee*_*man 8

根据这个评论, jQuery可能不可靠,这个页面说:

event.whichIE中的未定义<9 keydownkeyup.

event.keyCodekeypress对于返回字符的键,Gecko(Seamonkey,Firefox)中的0为0 .

event.charCode 仅在Internet Explorer(Mac)的keydown和keyup上受支持.

在JSFiddle上试试吧

  • 这对我有帮助.这应该是公认的答案.我使用以下行来规范化这些属性:`var code = event.which || event.keyCode || event.charCode;`这会抓取哪个字段不为null或0.如果它们都为零,则返回0. (3认同)