jQuery를 사용하여 이스케이프 키의 키 코드


559

두 가지 기능이 있습니다. 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)
});

Keypress는 키에 연결된 문자 (올바른 대문자 등)를 반환하고 Keyup은 누른 하드웨어 버튼 수를 반환합니다. ESC의 경우 하드웨어 코드 27 (아스키 문자 27 ​​아님)을 원할 것입니다.
Joeri


원하는 keyCode를 찾는 간단한 방법이 있습니다. 새 탭을 열고 document.addEventListener("keydown", e => console.log(e.keyCode))브라우저 콘솔에 넣고 창을 클릭 한 다음 원하는 키를 누르십시오.
무정부주의자

답변:


925

키업 이벤트를 사용해보십시오 .

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

39
이것은 keyup과 keypress와는 아무런 관련이 없습니다. ESCAPE를 캡처하려면 e.which (이 예제에서 수행)와 달리 e.keyCode를 확인해야합니다.
dkamins

211
"이것은 keyup과 keypress와는 아무런 관련이 없습니다."-그것은 잘못된 것입니다. dkamins. keypress가 브라우저간에 일관되게 처리되지 않는 것 같습니다 ( IE와 Chrome 대 Firefox의 api.jquery.com/keypress 데모를보십시오 -때로는 등록되지 않으며 'which'와 'keyCode'가 다름) 키 업은 일관성이 있습니다. e. 이것은 jquery 정규화 값이므로 'which'또는 'keyCode'는 모두 키 업에서 작동해야합니다.
Jordan Brough

13
@Jordan Brough-사람들이 댓글을 읽고 댓글의 실제 의미를 이해할 수 있도록 댓글로 답변을 게시하고 싶습니다. 귀하의 의견은 설명하는 답변만큼 중요하기 때문에
Murtaza

15
keydown기본 동작을 모방합니다-적어도 Windows에서 대화 상자에서 ESC 또는 Return 키를 누르면 키를 놓기 전에 작업이 트리거됩니다.
thomthom

2
@gibberish 나는 여기에 답변으로 내 의견을 추가했습니다 : stackoverflow.com/a/28502629/58876
Jordan Brough

77

함수에서 키 코드 값을 하드 코딩하는 대신 명명 된 상수를 사용하여 의미를보다 잘 전달하는 것이 좋습니다.

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 질문 은 다른 브라우저에서도 해당 객체를 정의하는 좋은 방법을 보여줍니다.


15
뭐, 27 당신이 탈출 열쇠로 당신을 뛰어 넘지 않습니까?!? 솔직히 이것은 더 많은 사람들이해야합니다. 나는 그것들을 "매직 넘버"와 "매직 스트링"이라고 부릅니다. 72의 의미는 무엇입니까? 코드베이스에 매우 구체적이고 휘발성이있는 문자열을 300 번 복사하여 붙여 넣는 이유는 무엇입니까? 등
vbullinger

1
또는 각 댓글을 한 번만 사용할 것이므로 각각 위에 주석을 추가 할 수 있습니다. 읽기 쉬운 IMO
Ivan Durst

8
@IvanDurst 당신은 한 번만 사용할 수 있습니다 메소드 당 사용할 수 있지만 프로젝트에서 여러 번 사용합니다. 키 코드를 사용하려고 할 때마다 (1) 값을 찾고 (2) 주석을 달기를 원하십니까? 나는 당신에 대해 모른다. 그러나 나는 그것들을 암기하려는 소망이나 다른 프로그래머들이 지속적으로 그것들을 언급 할 것이라는 믿음이 없다. 더 읽기 쉽고, 코딩을 더 쉽고 일관성있게 만드는 것입니다.
세스 페트리 존슨

2
무슨 뜻인지 아는 사람은 의견을 말하려는 의미를 찾을 필요가 없으며, 의견을 입력하는 것은 긴 이름을 입력하는 것만 큼 빠릅니다.
NetMage

6
문자 상수를 16 진수로 코딩 할 때 예전에는 어떤 일이 있었습니까? 누구나 ESC가 0x1B있고 Enter가 0x0D맞다 는 것을 알고 있습니까?
David R Tribble

42

( 이전 의견 에서 추출 된 답변 )

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등록되지 않음 및 'which'및 ' keyCode '는 다름) keyup일관성이 있습니다.

e.whichvs에 대한 논의가 있기 때문에 e.keyCode: e.whichjquery-normalized 값이며 사용을 권장합니다.

event.which 속성은 event.keyCode 및 event.charCode를 정규화합니다. 키보드 키 입력을위한 이벤트를 시청하는 것이 좋습니다.

( http://api.jquery.com/event.which/에서 )


5
또한 keypress탈출시 실행 되지 않는 브라우저가 올바르게 작동한다고 여기에 추가하고 싶습니다 . keypress키가 캐릭터를 생성 할 때만 keyup발사 되는 반면 항상 발사합니다. developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi

26

키의 키 코드를 찾으려면 다음과 같은 간단한 기능을 사용하십시오.

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

14

27이스케이프 키의 코드입니다. :)


1
Enter 키를 누르면 함수가 올바르게 실행되지만 이스케이프 키로는 작동하지 않습니다. $ (document) .keypress (function (e) {if (e.which == 13) {$ ( '. save'). click } if (e. which == 27) {$ ( '. cancel'). click ();}});
Shishant

$ (document) .keypress (function (e) {y = e.keyCode? e.keyCode : e.which;}); 경고 할 때 IE와 FF에서 27 경고합니다. 코드에 다른 문제가 없습니까?
Salty

14

최선의 방법은

$(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정규화 된 것보다 더 바람직합니다
  • keyup 보다 바람직하다 keydown사용자가 계속 누르고 있으면 키 다운이 여러 번 발생할 수 있기 때문에 합니다.
  • keypress실제 문자를 캡처 하지 않는 한 사용 하지 마십시오 .

흥미롭게도 부트 스트랩은 드롭 다운 구성 요소에서 키 다운과 키 코드를 사용합니다 (3.0.2 현재)! 나는 그것이 아마도 좋지 않은 선택이라고 생각합니다.

JQuery 문서의 관련 스 니펫

브라우저는 서로 다른 속성을 사용하여이 정보를 저장하지만 jQuery는 .which 속성을 정규화하여 키 코드를 검색하는 데 안정적으로 사용할 수 있습니다. 이 코드는 화살표와 같은 특수 키 코드를 포함하여 키보드의 키에 해당합니다. 실제 텍스트 입력을 잡으려면 .keypress ()가 더 나은 선택 일 수 있습니다.

관심있는 다른 항목 : JavaScript Keypress Library


10

jEscape 플러그인을 사용해보십시오 ( Google 드라이브에서 다운로드 )

$(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

코드가 정상적으로 작동합니다. 초점이 맞지 않은 창일 가능성이 높습니다. 비슷한 기능을 사용하여 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';
    }

});

8

나는 똑같은 일을하려고하고 있었고 그것은 나에게 쓰레기를 버리고 있었다. 파이어 폭스에서는 이스케이프 키를 눌렀을 때 어떤 일을하려고하면 이스케이프 키를 계속 처리 한 다음 수행하려는 모든 작업을 취소합니다. 경고가 잘 작동합니다. 그러나 제 경우에는 효과가 없었던 역사로 돌아가고 싶었습니다. 마지막으로 아래 그림과 같이 이벤트 전파를 중지해야한다는 것을 알았습니다 ...

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

8

다른 답변이없는 곳을 설명하기 위해; 문제는 당신의 사용입니다keypress .

아마도 이벤트의 이름은 잘못 지정되었지만 keypresswhen가 발생하도록 정의되었을 수 있습니다. 즉 텍스트입니다. 당신이 원하는 것은 /입니다 .when an actualcharacteris being inserted
keydownkeyupthe user depresses akey 합니다. 즉, 키보드에있는 것들입니다.

차이점 esc제어 문자 (문자 그대로 '비 인쇄 문자')이므로 텍스트를 쓰지 않으므로 실행조차하지 않기 때문에 여기에 나타납니다 keypress.
enter제어 문자 (예 : UI 제어)로 사용하더라도 여전히 개행 문자를 삽입하여 실행됩니다 keypress.

출처 : quirksmode


1
사양을 읽어 주셔서 감사합니다! 이것은 확실히 인정 된 답변이어야합니다 :)
DylanYoung

7

모든 문자에 대한 16 진 코드를 얻으려면 http://asciitable.com/


2
나는 ..... 나는이 사이트가 너무 추악한 때문에 검색 결과의 최상위에있는 것을 싫어하지만 필요한 정보를 전달합니다.
mpen

1
이벤트 및 브라우저에 따라 키 코드가 ASCII 테이블과 항상 일치하는 것은 아닙니다.
Alan H.

2
downvote : 질문에 답하지 않고, 심지어 질문도 다루지 않으며, 16 진법은 질문과 관련이 없으며 OP는 이미 esc == 27에 대한 지식을 보여주었습니다.
Jeremy

7

e.keyCodeMDN에서 DEPRECATED로 간주 되는 것보다 업데이트 된 답변을 게시하기 만하면됩니다 .

오히려 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);

3
그러나 Firefox 및 Chrome에서만 지원되는 것 같습니다.
가얀 Weerakutti


불행히도, 일부 Internet Explorer 버전은 Escstandard 대신 코드를 전달합니다 Escape.
로빈 스튜어트

6

키보드 입력 및 입력 된 키 조합을 캡처하기위한 강력한 Javascript 라이브러리 종속성이 없습니다.

http://jaywcjlove.github.io/hotkeys/

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

: 단축키는 다음과 같은 수식을 이해하고 , shiftoptionaltctrlcontrolcommand하고 .

다음 특수 키는 바로 가기를 사용할 수 있습니다 : backspacetab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, deletef1를 통해 f19.


5

나는 항상 키 업과 e. 이스케이프 키를 잡기 위해 사용했습니다.


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