순수 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

7
: 나는 어떤 브라우저에서 작동하는 것을 알 수 quirksmode.org 항상 믿을만한 찾으 quirksmode.org/js/keys.html . 당신 만이 찾을 수 keyup또는 keydown과의 조합으로 keyCode모든 브라우저에서 작동합니다.
Felix Kling

1
이 질문의 제목은 "jquery로 이스케이프 키 누르기를 감지하는 방법"이어야한다고 생각합니다. 또는 답변은 기본 자바 스크립트로 작성해야합니다.
Wilt

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

답변:


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')
클런 MCD합니다.

9
어떤 키를 눌렀는지 확인하려면 e.keycode 대신 e.which를 사용하는 것이 좋습니다. jQuery는 키 코드 및
문자

1
@DMTintner : 같은 주제에 Jordan Jordan이 남긴 주석 참조 stackoverflow.com/a/1160109/759452
Adrien Be

8
항상을 사용해야 ===합니다.
pmandell

211

keydown이벤트는 Escape에서 잘 작동 keyCode하며 모든 브라우저에서 사용할 수 있다는 이점이 있습니다 . 또한 document본체 가 아닌 리스너를 연결해야합니다 .

2016 년 5 월 업데이트

keyCode은 더 이상 사용되지 않으며 현재 대부분의 최신 브라우저는 현재 key속성을 제공 하지만 현재로서는 Chrome 지원을 위해 대체품이 필요합니다 (현재 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>요소에 추가 할 수도 있으므로이 요소에 포커스가있을 때만 트리거됩니다.
Mike

1
@ Ranmocy : 어떤 종류의 요소입니까 (ID가 'test'인 요소)? 포커스를받을 수있는 요소 (양식 입력, 컨텐츠 편집 가능 요소, tabindex가 설정된 요소) 만 주요 이벤트를 발생시킵니다.
Tim Down

1
if (evt.key === 'Escape') {더 이상 사용되지 않는keyCode
Keysox

1
@tobymackenzie : 그렇습니다. 놀랍지 않나요? 표준 기반 웹 개발의 용감한 새로운 세계에 오신 것을 환영합니다.
Tim Down

1
안전하게 사용할 수 있는지 알고 .key싶으시면 caniuse.com/#feat=keyboardevent-key
Jasper de Vries 님의

37

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

17

keyCode&& which& keyup|| 확인keydown

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

나는 이것이 탈출을위한 jsfiddle.net/GWJVt 작동하지 않는 것을 본다 ... 어색한 것 같습니까?
레이 겔

$ (document.body) .keypress ()가 실행되지 않습니다
Mithun Sreedharan

@ Reigel : 실제로 키 누르기와 함께 제대로 작동하지 않는 것 같습니다. 어쨌든 나는 '어색한'부분을 이해할 수 없습니다.
jAndy

3
KeyPress는 키를 누른 상태에서 문자 키에 대해 발생합니다 (KeyDown 및 KeyUp과 달리 문자가 아닌 키에 대해서도 발생).
Marta

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에서는 아닙니다.
samson

1
이 의견에 감사 드리며 업데이트 및 변경 규칙을 작성했습니다. keydown문제를 해결.
Ivijan Stefan Stipić

'한 번만'사용을 지원할 수 있도록 솔루션을 업데이트했습니다. 다음은 예입니다 : jsfiddle.net/oxok5x2p .
dh

6

아래는 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

가장 간단한 방법은 바닐라 자바 ​​스크립트라고 생각합니다.

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

6
내 크롬 (버전 55.0.2883.95 (64 비트))에 나는 얻을 Escape으로 event.key하지 27
MosheZada

event.keyCode27 이어야합니다.
Jens Törnell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.