jQuery的转义键的哪个键代码


559

我有两个功能。当按下回车键时,功能正常运行,但是当按下退出键时,功能无法正常运行。退出键的正确数字是多少?

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

按键将返回连接到按键的字符(使用正确的大写字母等),按键将返回按下的硬件按钮的数量。对于ESC,您需要硬件代码27(而不是ascii字符27)
Joeri 2015年


有一个非常简单的技巧来找出您想要的任何keyCode。只需打开一个新选项卡,放入document.addEventListener("keydown", e => console.log(e.keyCode))浏览器控制台,在窗口中单击并按所需的键即可。
anarchist912

Answers:


925

尝试使用keyup事件

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

39
这与keyup vs. keypress无关。要捕获ESCAPE,您需要查看e.keyCode而不是e。哪个(本示例恰好这样做)。
dkamins 2010年

211
“这与keyup与keypress无关”-dkamins,这是不正确的。似乎在浏览器之间无法统一处理keypress(在IE,Chrome和Firefox中尝试在api.jquery.com/keypress上进行演示,有时无法注册,并且“哪个”和“ keyCode”都不同)而keyup是一致的。e。哪个是jquery规范化的值,所以“哪个”或“ keyCode”都应该在keyup中起作用。
约旦·布劳

13
@Jordan Brough-我想请您发表您的评论作为答案,以便人们阅读并理解您评论的实际含义!因为您的评论与答案的解释一样重要
Murtaza 2012年

15
keydown会模仿本机行为-至少在Windows上,在释放键之前,在对话框中按ESC或Return会触发操作。
thomthom,2012年

2
@gibberish我已在此处添加了我的评论作为答案:stackoverflow.com/a/28502629/58876
Jordan Brough

77

与其硬编码功能中的键码值,不如考虑使用命名常量来更好地传达您的含义:

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();
});

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


15
什么,27不只是作为逃生钥匙跳向您?!?老实说,这确实需要更多的人来完成。我称它们为“魔术数字”和“魔术字符串”。72是什么意思?为什么在代码库中有300次非常具体且易失的字符串被复制粘贴?等
vbullinger

1
或者,您可以只在每个注释上方添加一条注释,因为您可能只使用它们一次。IMO就像可读
伊万·德斯特

8
@IvanDurst您每个方法只能使用它们一次,但是我在我的项目中多次使用它们。您是否真的在建议您(1)查找值,并(2)每次想使用键控代码时对它们进行注释?我不了解您,但是我既不希望记住它们,也不相信其他程序员会一致地评论他们。这是为了使编码更容易,更一致,而不仅仅是更具可读性。
Seth Petry-Johnson

2
知道其含义的人不必查找含义即可对其进行注释,键入注释与键入长名一样快。
NetMage 2014年

6
过去,当我们过去用十六进制编码字符常量时,发生了什么事?大家都知道ESC是0x1B,Enter是0x0D,对吗?
David R Tribble 2015年

42

(答案摘自我以前的评论

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

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

keypress似乎无法在浏览器之间进行一致处理(请在IE,Chrome和Firefox中尝试http://api.jquery.com/keypress上的演示,有时keypress无法注册,并且“哪个”和“ keyCode”),但keyup保持一致。

由于对e.whichvs 进行了一些讨论e.keyCode:请注意,这e.which是jquery规范化的值,是建议使用的值:

event.which属性规范化event.keyCode和event.charCode。建议观看事件。用于键盘键输入。

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


5
我还要在这里补充一点,那些不会keypress在逃生时触发的浏览器是正确的。keypress仅在键产生字符时才keyup触发,而总是触发。developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi,2016年

26

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

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}

14

27是转义键的代码。:)


1
我有两个函数,按enter键可以正常运行,但不能使用转义键。.$(document).keypress(function(e){if(e.which == 13){$('。save')。click ();} if(e.which == 27){$('。cancel')。click();}});
Shishant

$(document).keypress(function(e){y = e.keyCode?e.keyCode:e.which;}); 当我警报时,它会在IE和FF中警报27。您确定代码没有其他问题吗?

14

你最好的选择是

$(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();
});

摘要

  • whichkeyCode归一化因为它更可取
  • keyup比之更为可取,keydown因为如果用户持续按下keydown可能会多次发生。
  • keypress除非要捕获实际字符,否则不要使用。

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

JQuery文档中的相关代码段

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

其他有趣的项目:JavaScript Keypress库


10

试用jEscape插件(从Google Drive下载

$(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;
}

8

您的代码工作正常。很有可能是窗口没有聚焦。我使用类似的功能关闭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';
    }

});

8

我正在尝试做同样的事情,这让我很讨厌。在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);
}

8

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

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

之所以出现差异,esc是因为它是控制字符(字面上是“非打印字符”),因此不会写任何文本,因此甚至不会触发keypress
enter很奇怪,因为即使您将其用作控制字符(即,用于控制UI),它仍在插入换行字符,这将触发keypress

资料来源:quirksmode


1
阅读规格的荣誉!这应该是肯定可以接受的答案:)
DylanYoung '18

7

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


2
我要说的是.....我讨厌这个网站位于搜索结果的顶部,因为它是如此的难看,但是它确实传达了必要的信息。
mpen

1
请注意,取决于事件和浏览器,键代码并不总是与ascii表匹配。
艾伦·H。

2
downvote:不回答这个问题,甚至不解决问题,六角无关与问题和OP ESC已经证明知识== 27
杰里米

7

仅发布更新的答案,而不是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);

3
但这似乎仅在Firefox和Chrome中受支持。
加安·维拉库蒂


不幸的是,至少某些版本的Internet Explorer传递了代码Esc而不是标准代码Escape
罗宾·斯图尔特

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;
    }
});

热键了解以下修饰符:shiftoptionaltctrlcontrolcommand,和

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.