我有两个函数。当按下回车键时,函数正常运行,但当按下escape键时,它就不正常了。退出键的正确数字是多少?

$(document).keypress(function(e) { 
    if (e.which == 13) $('.save').click();   // enter (works as expected)
    if (e.which == 27) $('.cancel').click(); // esc   (does not work)
});

当前回答

你最好的选择是

$(document).keyup(function(e) { 
    if (e.which === 13) $('.save').click();   // enter 
    if (e.which === 27) $('.cancel').click(); // esc   

    /* OPTIONAL: Only if you want other elements to ignore event */
    e.preventDefault();
    e.stopPropagation();
});

总结

哪个比keyCode更可取,因为它是规范化的 Keyup比keydown更可取,因为如果用户一直按下,keydown可能会出现多次。 不要使用按键,除非你想捕捉实际的字符。

有趣的是,Bootstrap在下拉组件中使用keydown和keyCode(从3.0.2开始)!我觉得这是个糟糕的选择。

来自JQuery文档的相关片段

而浏览器使用不同的 属性来存储这些信息,jQuery规范化了 属性,以便您可以可靠地使用它来检索密钥代码。这 代码对应键盘上的一个键,包括特殊的代码 键,如箭头。为了捕获实际的文本输入,.keypress()可能 是一个更好的选择。

其他有趣的项目:JavaScript按键库

其他回答

我也在试着做同样的事情,这让我很烦。在firefox中,如果你在按下escape键时尝试做一些事情,它会继续处理escape键,然后取消你试图做的任何事情。Alert工作正常。但在我的情况下,我想回到历史,这是行不通的。最后我发现我必须强制事件的传播停止,如下所示…

if (keyCode == 27)
{
    history.back();

    if (window.event)
    {
        // IE works fine anyways so this isn't really needed
        e.cancelBubble = true;
        e.returnValue = false;
    }
    else if (e.stopPropagation)
    {
        // In firefox, this is what keeps the escape key from canceling the history.back()
        e.stopPropagation();
        e.preventDefault();
    }

    return (false);
}

(答案摘自我之前的评论)

你需要使用keyup而不是keypress。例如:

$(document).keyup(function(e) {
  if (e.which == 13) $('.save').click();     // enter
  if (e.which == 27) $('.cancel').click();   // esc
});

键盘按键在不同浏览器之间的处理似乎不一致(请在http://api.jquery.com/keypress上尝试IE vs Chrome vs Firefox的演示。有时按键不注册,'which'和'keyCode'的值都不同),而keyup是一致的。

由于有一些关于e.which和e.keyCode的讨论:请注意,e.which是jquery规范化的值,是推荐使用的值:

该事件。哪个属性规范化事件。keyCode和event.charCode。建议观看赛事。其中用于键盘按键输入。

(来自http://api.jquery.com/event.which/)

试试jEscape插件(从谷歌驱动器下载)

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

或获得跨浏览器的键码

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

也许你可以用开关

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}

解释其他答案没有解释的地方;问题是你用的按键。

也许事件只是命名错误,但按键被定义为当插入一个实际字符时触发。即文本。 而你想要的是keydown/keyup,它在用户按下keyey之前或之后触发。也就是键盘上的那些东西。

区别出现在这里,因为esc是一个控制字符(字面上是“非打印字符”),因此不写入任何文本,因此甚至不触发按键。 enter是奇怪的,因为即使你使用它作为一个控制字符(即控制UI),它仍然插入一个换行字符,这将触发按键。

来源:quirksmode

27是escape键的代码。:)