【问题标题】:How to detect escape key press with pure JS or jQuery?如何使用纯 JS 或 jQuery 检测转义按键?
【发布时间】:2011-03-23 03:02:12
【问题描述】:

可能重复:
Which keycode for escape key with jQuery

如何检测 IE、Firefox 和 Chrome 中的转义键按下? 下面的代码在 IE 中工作并提醒 27,但在 Firefox 中它会提醒 0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});

【问题讨论】:

  • 先做一些浏览器检测?
  • 我发现 quirksmode.org 总是可靠地找出在哪个浏览器中有效的方法:quirksmode.org/js/keys.html。在那里您会发现只有 keyupkeydownkeyCode 结合使用适用于所有浏览器。
  • 我觉得这个问题的题目应该是“How to detect escape key press with jquery?”或者答案应该是原生 javascript...
  • $(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);}); 2014 年的问候

标签: javascript jquery keyevent jquery-events


【解决方案1】:

注意:keyCodebecoming deprecated,请改用 key

function keyPress (e) {
    if(e.key === "Escape") {
        // write your logic here.
    }
}

代码片段:

var msg = document.getElementById('state-msg');

document.body.addEventListener('keypress', function(e) {
  if (e.key == "Escape") {
    msg.textContent += 'Escape pressed:'
  }
});
Press ESC key <span id="state-msg"></span>

keyCode 即将被弃用

似乎keydownkeyup 有效,尽管keypress 可能无效


$(document).keyup(function(e) {
     if (e.key === "Escape") { // escape key maps to keycode `27`
        // <DO YOUR WORK HERE>
    }
});

Which keycode for escape key with jQuery

【讨论】:

  • 解除绑定:$(document).unbind("keyup", keyUpFunc);
  • 要取消绑定,您还可以在事件中使用命名空间$(document).on('keyup.unique_name', ...)$(document).unbind('keyup.unique_name')
  • 推荐使用e.which(而不是e.keycode)来检查哪个键被按下了。 jQuery 规范化 keycode 和 charcode(在旧浏览器中使用)
  • 您应该始终使用===
  • @LachlanMcD - 请注意(5 年后!).unbind 现在已被 jQuery 3.0 弃用...您应该使用 .off
【解决方案2】:

keydown 事件可以很好地用于 Escape,并且可以让您在所有浏览器中使用 keyCode。此外,您需要将侦听器附加到 document 而不是正文。

2016 年 5 月更新

keyCode 现在正处于被弃用的过程中,大多数现代浏览器现在都提供key 属性,尽管您现在仍然需要一个后备来获得体面的浏览器支持(在编写当前版本的 Chrome 时)和 Safari 不支持)。

2018 年 9 月更新 现在所有现代浏览器都支持evt.key

document.onkeydown = function(evt) {
    evt = evt || window.event;
    var isEscape = false;
    if ("key" in evt) {
        isEscape = (evt.key === "Escape" || evt.key === "Esc");
    } else {
        isEscape = (evt.keyCode === 27);
    }
    if (isEscape) {
        alert("Escape");
    }
};
Click me then press the Escape key

【讨论】:

  • 注意,您还可以将监听器添加到&lt;input&gt; 元素,因此只有在该元素具有焦点时才会触发。
  • 您也可以检查if (evt.key === 'Escape') {,而不是使用已弃用的keyCode
  • @Keysox:对于大多数现代浏览器,是的,尽管您现在仍然需要后备。我将编辑我的答案。
  • 仅供参考,MDN's reference to keyCode(包括弃用节点)
  • 如果您想知道是否可以安全使用.key,请参阅caniuse.com/#feat=keyboardevent-key
【解决方案3】:

使用JavaScript你可以做检查工作jsfiddle

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.keyCode == 27) {
        alert('Esc key pressed.');
    }
};

使用jQuery你可以做检查工作jsfiddle

jQuery(document).on('keyup',function(evt) {
    if (evt.keyCode == 27) {
       alert('Esc key pressed.');
    }
});

【讨论】:

  • Intellij 说您的 vanilla js 代码 sn-p 已弃用。我应该什么时候停止使用它?
【解决方案4】:

检查keyCode && which & keyup || keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});

【讨论】:

  • 我发现这行不通,jsfiddle.net/GWJVt 只是为了逃跑……看起来很尴尬?
  • $(document.body).keypress() 没有触发
  • @Reigel:确实,似乎无法正常使用按键。无论如何,我想不出“尴尬”的部分。
  • KeyPress 用于字符键(与 KeyDown 和 KeyUp 不同,它们也用于非字符键)。
【解决方案5】:

下面的代码不仅会禁用 ESC 键,还会检查按下它的条件,并根据情况执行或不执行操作。

在这个例子中,

e.preventDefault();

将禁用 ESC 按键操作。

你可以用这个来隐藏一个 div:

document.getElementById('myDivId').style.display = 'none';

ESC 键按下的位置也被考虑在内:

(e.target.nodeName=='BODY')

如果您想将其应用于所有人,您可以删除此 if 条件部分。或者您可以在此处定位 INPUT 以仅在光标位于输入框中时应用此操作。

window.addEventListener('keydown', function(e){
    if((e.key=='Escape'||e.key=='Esc'||e.keyCode==27) && (e.target.nodeName=='BODY')){
        e.preventDefault();
        return false;
    }
}, true);

【讨论】:

    【解决方案6】:

    纯 JS

    您可以将侦听器附加到文档的keyUp 事件。

    另外,如果您想确保没有按下任何其他键和Esc 键,您可以使用ctrlKeyaltKeyshifkey 的值。

     document.addEventListener('keydown', (event) => {
            
            if (event.key === 'Escape') {
             //if esc key was not pressed in combination with ctrl or alt or shift
                const isNotCombinedKey = !(event.ctrlKey || event.altKey || event.shiftKey);
                if (isNotCombinedKey) {
                    console.log('Escape key was pressed with out any group keys')
                  
                }
            }
        });
    

    【讨论】:

      【解决方案7】:

      最好的方法是为此制作函数

      功能:

      $.fn.escape = function (callback) {
          return this.each(function () {
              $(document).on("keydown", this, function (e) {
                  var keycode = ((typeof e.keyCode !='undefined' && e.keyCode) ? e.keyCode : e.which);
                  if (keycode === 27) {
                      callback.call(this, e);
                  };
              });
          });
      };
      

      示例:

      $("#my-div").escape(function () {
          alert('Escape!');
      })
      

      【讨论】:

      • 实际上,keypress 似乎不会在转义键上触发。至少,不是在 Mac 上的 Chrome 中。
      • 感谢您的反馈,我制定了更新和更改规则。 keydown 解决问题。
      • 我更新了您的解决方案,使其能够支持“仅一次”使用。这是一个例子:jsfiddle.net/oxok5x2p.
      • 只有一次的酷解决方案
      【解决方案8】:

      纯 JS(无 JQuery)

      document.addEventListener('keydown', function(e) {
          if(e.keyCode == 27){
            //add your code here
          }
      });
      

      【讨论】:

      • 您好,感谢您回答这个问题,根据网站指南,请添加一些解释性文本来解释其工作原理/原因。谢谢!
      【解决方案9】:

      在 Firefox 78 上使用这个(“keypress”不适用于 Escape 键):

      function keyPress (e)(){
        if (e.key == "Escape"){
           //do something here      
        }
      document.addEventListener("keyup", keyPress);
      

      【讨论】:

        【解决方案10】:

        我认为最简单的方法是香草 javascript:

        document.onkeyup = function(event) {
           if (event.keyCode === 27){
             //do something here
           }
        }
        

        更新:更改密钥 => keyCode

        【讨论】:

        • 在我的 chrome 上(版本 55.0.2883.95(64 位))我得到 Escapeevent.key 而不是 27
        • 27 应该是event.keyCode
        猜你喜欢
        • 1970-01-01
        • 2011-03-17
        • 2017-07-09
        • 1970-01-01
        • 2012-10-31
        • 2019-01-05
        • 2011-08-03
        相关资源
        最近更新 更多