使用 jQuery 转义键的键码

IT技术 javascript jquery
2021-01-18 11:19:16

我有两个功能。当按下 Enter 时,功能运行正常,但当按下 Esc 时它不会。转义键的正确数字是多少?

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

尝试使用keyup 事件

$(document).on('keyup', function(e) {
  if (e.key == "Enter") $('.save').click();
  if (e.key == "Escape") $('.cancel').click();
});
@Jordan Brough - 我想请您发布您的评论作为答案,以便人们阅读并理解您评论的实际含义!因为您的评论与解释的答案一样重要
2021-03-18 11:19:16
这与 keyup 与 keypress 无关。要捕获 ESCAPE,您需要查看 e.keyCode 而不是 e.which(本示例恰好是这样做的)。
2021-04-02 11:19:16
“这与 keyup 与 keypress 无关” - 这是不正确的,dkamins。keypress似乎在浏览器之间的处理方式不一致(在api.jquery.com/keypress 上试用IE 与 Chrome 与 Firefox 中的演示——有时它不会注册,并且“which”和“keyCode”都不同)而 keyup 是一致的。e.which 是 jquery 规范化的值,所以 'which' 或 'keyCode' 都应该在 keyup 中工作。
2021-04-03 11:19:16
keydown将模仿本机行为 - 至少在 Windows 上,在对话框中按 ESC 或 Return 将在释放键之前触发操作。
2021-04-06 11:19:16
@gibberish 我在这里添加了我的评论作为答案:stackoverflow.com/a/28502629/58876
2021-04-11 11:19:16

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

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 question展示了在其他浏览器中定义该对象的好方法。

并不是说我以任何方式反对命名常量,但我认为值得注意的是 ENTER 可以被视为例外情况。如果有人选择使用 13 个“原始”和无评论,我并不觉得这是糟糕的形式,因为这是一个合理的期望,即所有 Web 开发人员都会将其视为“输入”而不会混淆。
2021-03-14 11:19:16
知道他们的意思的人不必查找含义来评论他们,输入评论就像输入一个长名字一样快。
2021-03-16 11:19:16
什么,27 不只是跳出来作为逃生键?!?老实说,这确实需要更多人来完成。我称它们为“魔术数字”和“魔术弦”。72是什么意思?为什么您的代码库中有一个非常具体且易变的字符串复制粘贴了 300 次?等等。
2021-04-02 11:19:16
@IvanDurst 您可能每个方法只使用一次,但我在我的项目中多次使用它们。您是否真的建议在每次要使用关键代码时 (1) 查找值和 (2) 注释它们?我不了解你,但我既不想记住它们,也不相信其他程序员会一致地评论它们。这是关于使编码更容易、更一致,而不仅仅是更易读。
2021-04-05 11:19:16
过去我们用十六进制编码字符常量的美好时光发生了什么?每个人都知道 ESC0x1B和 Enter 是0x0D,对吧?
2021-04-08 11:19:16

(答案摘自我之前的评论

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

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

keypress浏览器之间似乎没有一致处理(在 IE vs Chrome vs Firefox 中尝试http://api.jquery.com/keypress的演示。有时keypress不注册,以及 'which' 和 ' 的值keyCode' 变化)而keyup一致。

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

event.which 属性规范了 event.keyCode 和 event.charCode。建议观看 event.which 进行键盘按键输入。

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

我还想在这里补充一点,keypress在逃逸时不触发的浏览器做得对。keypress仅在键产生字符时才keyup触发,始终触发。developer.mozilla.org/en-US/docs/Web/Events/keypress
2021-03-19 11:19:16

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

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

27是转义键的代码。:)

$(document).keypress(function(e) { y=e.keyCode?e.keyCode:e.which;}); 当我警告(y)时,它会在 IE 和 FF 中警告 27。您确定您的代码没有其他问题吗?
2021-03-31 11:19:16
按下输入键时,我有两个功能,这些功能运行正常,但没有使用转义键.. $(document).keypress(function(e) { if (e.which == 13) { $('.save').click (); } if (e.which == 27) { $('.cancel').click(); } });
2021-04-11 11:19:16