如何使用纯JS或jQuery检测转义键?


524

可能重复:
jQuery的哪个键代码用于转义键

如何在IE,Firefox和Chrome中检测逃逸键按下?下面的代码在IE和警报中有效27,但在Firefox中它会警报0

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

1
首先进行一些浏览器检测?
ina 2010年

7
我发现quirksmode.org总是可靠的,以找出在哪种浏览器中有效的工具:quirksmode.org/js/keys.html。您可以在其中找到所有浏览器中的唯一作品keyupkeydown与之结合使用keyCode
Felix Kling

1
我认为这个问题的标题应该是“如何使用jquery检测转义键?” 或答案应该使用本地javascript ...
Wilt 2014年

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});2014
Kalle H.Väravas

Answers:


957

注:keyCode越来越过时的使用key来代替。

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

这是jsfiddle


keyCode 被弃用

它似乎 keydownkeyup工作,即使keypress可能没有


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

jQuery的转义键的哪个键代码


11
取消绑定:$(document).unbind(“ keyup”,keyUpFunc);
Plattsy

54
要取消绑定,您还可以在事件上使用名称空间,$(document).on('keyup.unique_name', ...)以及$(document).unbind('keyup.unique_name')
Lachlan McD。

9
建议使用e。哪个(而不是e.keycode)来检查按下了哪个键。jQuery规范化了键码和字符码(在较旧的浏览器中使用)
DMTintner 2014年

1
@DMTintner:关于同一主题,请参见Jordan Brough所发表的评论stackoverflow.com/a/1160109/759452
Adrien

8
您应该始终使用===
pmandell '16

210

keydown事件将对Escape正常运行,并具有允许您keyCode在所有浏览器中使用的优势。另外,您需要将侦听器附加到document主体上,而不是附加到主体上。

2016年5月更新

keyCode现在正处于弃用状态,并且大多数现代浏览器key现在都提供该属性,尽管您现在仍然需要一个不错的浏览器支持回落(撰写本文时,Chrome和Safari的当前版本不支持它)。

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

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


3
注意,您也可以将侦听器添加到<input>元素,因此仅在该元素具有焦点时才会被触发。
麦克,

1
@Ranmocy:这是什么类型的元素(ID为“ test”的元素)?只有能够接收焦点的元素(表单输入,可内容编辑的元素,设置了tabindex的元素)才会触发键事件。
蒂姆·唐

1
您也可以检查if (evt.key === 'Escape') {而不使用已弃用的内容keyCode
-Keysox

1
@tobymackenzie:就是这样。那不是很棒吗?欢迎来到基于标准的Web开发的美好新世界。
Tim Down

1
如果您想知道是否可以安全使用.key,请参阅caniuse.com/#feat=keyboardevent-key
Jasper de Vries


17

检查keyCode&& whichkeyup||keydown

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

我看到这不起作用,jsfiddle.net / GWJVt只是为了逃避……似乎很尴尬?
Reigel

$(document.body).keypress()未触发
Mithun Sreedharan 2010年

@Reigel:确实,在按键时似乎无法正常工作。无论如何,我无法理解“尴尬”的部分。
jAndy

3
按下键时,对于字符键会升高KeyPress(与KeyDown和KeyUp不同,对于非字符键也会升高)。
玛尔塔2015年

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

4
实际上,似乎keypress没有在转义键上触发。至少不是在Mac上的Chrome中。
萨姆森,2015年

1
感谢您的反馈,我制定了更新和更改规则。keydown解决问题。
Ivijan StefanStipić15年

我更新了您的解决方案,使其能够支持“仅一次”使用。这是一个示例:jsfiddle.net/oxok5x2p
dh

6

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

在这个例子中

e.preventDefault();

将禁用ESC按键操作。

您可以执行以下操作来隐藏div:

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

还考虑了按ESC键的地方:

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

如果您希望将其应用于所有内容,则可以删除此条件部分。或者,您可以将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);

0

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

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

6
在我的铬(版本55.0.2883.95(64位)),我得到Escapeevent.key,而不是27
MosheZada

它应该event.keyCode是27
延Törnell
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.