使用jQuery的escape key的哪个键代码

Shi*_*ant 547 javascript jquery

我有两个功能.当按下enter时,功能正常运行,但是当按下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)
});
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 909

尝试使用keyup事件:

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});
Run Code Online (Sandbox Code Playgroud)

  • "这与keyup vs. keypress无关" - 这是不正确的,dkamins.在浏览器之间似乎没有一致地处理keypress(在IE浏览器中尝试http://api.jquery.com/keypress/的演示与Chrome和Firefox的比较 - 有时它不会注册,并且'和' 'keyCode'变化)而keyup是一致的.e.which是jquery-normalized值,因此'which'或'keyCode'都应该在keyup中工作. (210认同)
  • 这与keyup与keypress无关.要捕获ESCAPE,您需要查看e.keyCode而不是e.which(这个例子碰巧会这样做). (39认同)
  • `keydown`将模仿原生行为 - 至少在Windows上,在对话框中按ESC或Return键会在释放键之前触发操作. (15认同)
  • @Jordan Brough - 我想请求您发表评论作为答案,以便人们阅读并理解您评论的实际含义!因为你的评论和答案解释一样重要 (13认同)
  • @gibberish我在这里添加了我的评论作为答案:http://stackoverflow.com/a/28502629/58876 (2认同)

Set*_*son 74

不要硬编码函数中的键码值,而应考虑使用命名常量来更好地表达您的含义:

var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;

$(document).keyup(function(e) {
  if (e.keyCode == KEYCODE_ENTER) $('.save').click();
  if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});
Run Code Online (Sandbox Code Playgroud)

某些浏览器(如FireFox,不确定其他浏览器)定义了一个全局KeyEvent对象,为您公开这些类型的常量.这个SO问题也显示了在其他浏览器中定义该对象的好方法.

  • 什么,27不只是跳出来作为逃生钥匙?!?老实说,这确实需要更多人来完成.我把它们称为"神奇数字"和"神奇的字符串".72是什么意思?为什么在代码库中有300次非常具体且易变的字符串复制粘贴?等等 (14认同)
  • @IvanDurst你可能只使用它们一次_per method_,但我在我的项目中多次使用它们.您是否真的建议您(1)查找值并(2)每次要使用密钥代码时对它们进行评论?我不了解你,但我既没有记住它们的愿望,也没有其他程序员会持续评论它们的信念.这是为了使编码更容易,更一致,而不仅仅是更具可读性. (7认同)
  • 无论过去曾经用十六进制编码字符常量的好时光发生了什么?每个人都知道ESC是'0x1B`而Enter是'0x0D`,对吗? (6认同)
  • 知道它们意味着什么的人不必查找意思来评论它们,输入注释就像输入长名一样快. (2认同)
  • 并不是说我以任何方式反对命名常量,但我认为值得注意的是 ENTER 可以被视为例外情况。如果有人选择使用 13 个“原始”和无评论,这并不会让我觉得是糟糕的形式,因为所有 Web 开发人员都会将其视为“输入”而不会混淆是合理的期望。 (2认同)
  • 您应该将其作为对已接受答案的评论。这只是实际答案的语义和绒毛。 (2认同)

Jor*_*ugh 39

(从我以前的评论中提取的答案)

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

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

keypress似乎没有在浏览器之间一致地处理(在IE浏览器和Chrome与Firefox 中的http://api.jquery.com/keypress上试用该演示.有时keypress不注册,以及'哪个'和'的值keyCode'变化',但是keyup是一致的.

由于有一些关于e.whichvs的讨论e.keyCode:注意这e.which是jquery-normalized值,并且是推荐使用的值:

event.which属性规范化event.keyCode和event.charCode.建议观看event.which键盘输入键.

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

  • 我还想在这里补充一点,那些在转义时不会触发`keypress`的浏览器正在做正确的事情.`keypress`只是在键生成一个字符时触发,而`keyup`始终触发.https://developer.mozilla.org/en-US/docs/Web/Events/keypress (5认同)

小智 25

要查找任何键的键码,请使用以下简单功能:

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}
Run Code Online (Sandbox Code Playgroud)


Sal*_*lty 13

27是转义键的代码.:)


Shi*_*hah 13

你最好的选择是

$(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();
});
Run Code Online (Sandbox Code Playgroud)

摘要

  • whichkeyCode归一化更优选
  • keyupkeydown如果用户按下它可以多次出现keydown 更为可取.
  • keypress除非您想捕获实际字符,否则请勿使用.

有趣的是,Bootstrap在其下拉组件中使用了keydown和keyCode(从3.0.2开始)!我认为这可能是糟糕的选择.

来自JQuery doc的相关代码片段

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

其他感兴趣的项目:JavaScript Keypress Library


小智 9

试试jEscape插件(从谷歌硬盘下载)

$(document).escape(function() { 
   alert('ESC button pressed'); 
});
Run Code Online (Sandbox Code Playgroud)

或获取跨浏览器的密钥代码

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');
Run Code Online (Sandbox Code Playgroud)

也许你可以使用开关

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


Eri*_*itz 7

你的代码工作得很好.这很可能是没有集中注意力的窗口.我使用类似的功能关闭iframe框等.

$(document).ready(function(){

    // Set focus
    setTimeout('window.focus()',1000);

});

$(document).keypress(function(e) {

    // Enable esc
    if (e.keyCode == 27) {
      parent.document.getElementById('iframediv').style.display='none';
      parent.document.getElementById('iframe').src='/views/view.empty.black.html';
    }

});
Run Code Online (Sandbox Code Playgroud)


小智 7

我正在尝试做同样的事情而且它正在惹恼我.在firefox中,似乎如果你在按下转义键时尝试做一些事情,它会继续处理转义键,然后取消你想要做的任何事情.警报工作正常.但就我而言,我想回到历史上不起作用.终于想通了我必须强制事件的传播停止,如下所示......

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);
}
Run Code Online (Sandbox Code Playgroud)


Jul*_*ien 6

要获取所有字符的十六进制代码:http://asciitable.com/

  • 我会说.....我讨厌这个网站位于搜索结果的顶部,因为它太丑了,但确实传达了必要的信息. (2认同)
  • downvote:没有回答问题,甚至没有解决问题,hex与问题无关,OP已经证明了esc == 27的知识. (2认同)

Has*_*own 6

解释其他答案没有的地方; 问题是你的使用keypress.

也许这个事件只是错误的命名,但keypress被定义为触发时.即文字. 而你想要的是/ ,无论何时(分别在之前或之后)都会发射.就是键盘上的那些东西.when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

这里出现的差异esc是因为它是一个控制字符(字面意思是'非打印字符'),因此不会写任何文本,因此甚至不会触发keypress.
enter很奇怪,因为即使你使用它作为控制字符(即控制UI),它仍然会插入一个新行字符,它将触发keypress.

资料来源:quirksmode


小弟调*_*弟调调 6

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

http://jaywcjlove.github.io/hotkeys/

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});
Run Code Online (Sandbox Code Playgroud)

热键了解以下修饰符:?shiftoption?altctrlcontrolcommand,和?

以下特殊键可用于快捷键:backspacetabclearenterreturnescescapespaceupdownleftrighthomeendpageuppagedowndeldeletef1通过f19


小智 5

我一直使用 keyup 和 e.which 来捕捉转义键。


Tro*_*eld 5

我知道这个问题是关于 jquery 的,但是对于那些使用 jqueryui 的人来说,许多键码都有常量:

$.ui.keyCode.ESCAPE
Run Code Online (Sandbox Code Playgroud)

http://api.jqueryui.com/jQuery.ui.keyCode/


aug*_*aug 5

仅发布更新的答案,而不是e.keyCode在MDN上认为已弃用

相反,您应该选择e.key支持所有名称的纯名称。这是相关的复制面食

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);
Run Code Online (Sandbox Code Playgroud)

  • 但这似乎仅在Firefox和Chrome中受支持。 (2认同)