当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用jQuery的escapekey的哪个键代码》经验,为你挑选了12个好方法。

我有两个功能.当按下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)
});

CMS.. 909

尝试使用keyup事件:

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

"这与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认同)


Seth Petry-J.. 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();
});

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



1> CMS..:

尝试使用keyup事件:

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


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

2> Seth Petry-J..:

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

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问题也显示了在其他浏览器中定义该对象的好方法.


什么,27不只是跳出来作为逃生钥匙?!?老实说,这确实需要更多人来完成.我把它们称为"神奇数字"和"神奇的字符串".72是什么意思?为什么在代码库中有300次非常具体且易变的字符串复制粘贴?等等
@IvanDurst你可能只使用它们一次_per method_,但我在我的项目中多次使用它们.您是否真的建议您(1)查找值并(2)每次要使用密钥代码时对它们进行评论?我不了解你,但我既没有记住它们的愿望,也没有其他程序员会持续评论它们的信念.这是为了使编码更容易,更一致,而不仅仅是更具可读性.
无论过去曾经用十六进制编码字符常量的好时光发生了什么?每个人都知道ESC是'0x1B`而Enter是'0x0D`,对吗?
知道它们意味着什么的人不必查找意思来评论它们,输入注释就像输入长名一样快.

3> Jordan Broug..:

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

你需要使用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-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

4> 小智..:

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

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



5> Salty..:

27是转义键的代码.:)



6> Shital Shah..:

你最好的选择是

$(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归一化更优选

keyupkeydown如果用户按下它可以多次出现keydown 更为可取.

keypress除非您想捕获实际字符,否则请勿使用.

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

来自JQuery doc的相关代码片段

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

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



7> 小智..:

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



8> Eric Herlitz..:

你的代码工作得很好.这很可能是没有集中注意力的窗口.我使用类似的功能关闭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';
    }

});



9> 小智..:

我正在尝试做同样的事情而且它正在惹恼我.在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);
}



10> Julien..:

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


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

11> Hashbrown..:

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

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

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

资料来源:quirksmode



12> aug..:

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


但这似乎仅在Firefox和Chrome中受支持。
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有