.keyCode와 .which


228

나는 이것이 스택 오버플로 어딘가에 대답 할 것이라고 생각했지만 찾을 수 없습니다.

키 누르기 이벤트를 수신하는 중이 .keyCode거나 .whichEnter 키를 눌렀는지 판별해야합니까?

나는 항상 다음과 같은 일을 해왔다.

$("#someid").keypress(function(e) {
  if (e.keyCode === 13) {
    e.preventDefault();
    // do something
  }
});

하지만 .which대신 사용 하는 예제가 표시 됩니다 .keyCode. 차이점이 뭐야? 크로스 브라우저가 다른 브라우저보다 더 친숙한가요?


1
이 두 가지 모두 현재 더 이상 사용되지 않는 것으로 간주됩니다 (FYI). developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/which developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
CodeFinity

답변:


209

주 : 대답은 아래 이후 2010 년 여기에 몇 년에 쓰여진, 모두 keyCodewhich찬성되지 않습니다 key(논리적 키) 및 code(키의 물리적 배치를 위해). 하지만 IE는 지원하지 않습니다 code에 대한, 그 지원 key사양의 이전 버전을 기반으로 그렇게 아주 정확하지 않습니다. 이 글을 쓰면서 EdgeHTML과 Chakra를 기반으로하는 현재 Edge는 지원하지 code않지만 Microsoft는 아마도 BlinkV8 기반 Edge를 대체 할 것입니다.


일부 브라우저는 사용 keyCode하고 다른 브라우저는 사용 합니다 which.

당신이 jQuery를 사용하는 경우, 당신은 안정적으로 사용할 수있는 whichjQuery를이 같은 일을 표준화 ; 여기 더 있습니다.

jQuery를 사용하지 않는 경우 다음을 수행 할 수 있습니다.

var key = 'which' in e ? e.which : e.keyCode;

또는 대안으로 :

var key = e.which || e.keyCode || 0;

... 가능성 처리하는 e.which수 있습니다 0(즉를 복원하여 0사용, 마지막에 자바 스크립트의 호기심 강력한 ||연산자 ).


2
감사합니다. TJ 이에 대한 참조는 어디에서 찾을 수 있습니까? 나는 당신을 믿지 않는 것이 아니라 단지 호기심입니다! ... 감사합니다. 따라서 jquery를 사용하지 않는 사람들에게도. 어느 것이 더 나은 선택입니까?
ScottE

7
@ ScottE : jQuery를 사용하지 않으면 명시 적으로 직접 처리해야합니다. 나는 보통 이런 식으로 그것을 var key = event.which || event.keyCode;사용하는 것 event.which이 정의되지 falsey 않다면, 또는 event.keyCode경우에 which정의되지 않았거나 falsey된다. 기술적으로 아마해야 var key = typeof event.which === "undefined" ? event.keyCode : event.which;하지만 경우 event.which입니다 0(이 될 수있다 0?), 나는 내가 할 일의 종류에 대한 관심 않을거야.
TJ Crowder

2
@ ScottE, 여기에 기본 참조가 있습니다 : quirksmode.org/js/keys.html (포함하지 않습니다 .jQuerywhich 에서만 제공한다고 생각하지만 100 % 확신 할 수는 없지만 시작해야합니다. 브라우저의 차이점)
Mottie

1
@fudgey : IE를 제외한 모든 브라우저에서 which제공됩니다 keypress. 그리고 quirksmode는 여기서 권위적이지 않습니다. : 참고로, @TJ 크라우 게시하는 링크가 훨씬 더 unixpapa.com/js/key.html .
Tim Down

5
@TJ Crowder : 예, 이벤트의 which속성은 0 일 수 있으며 이는 대부분의 응용 프로그램에 큰 차이를 만들 수 있습니다. 예를 들어 Firefox에서 인쇄 할 수없는 키의 which속성은 0이며 keyCode속성은 keydown입니다. keyCodeFirefox의 내 PC에서 Home 키 의 36은 "$"의 문자 코드이므로 36을 사용하면 Home 키를 누르는 사용자와를 사용하여 $ 문자를 입력하는 사용자를 구분할 수 없습니다 event.which || event.keyCode.
Tim Down

32

jQuery를이 normalises event.which여부에 따라 event.which, event.keyCode또는 event.charCode브라우저에 의해 지원됩니다

// Add which for key events
if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
   event.which = event.charCode != null ? event.charCode : event.keyCode;
}

또 다른 이점은 .whichjQuery가 마우스 클릭에도 적용한다는 것입니다.

// Add which for click: 1 === left; 2 === middle; 3 === right
// Note: button is not normalized, so don't use it
if ( !event.which && event.button !== undefined ) {
    event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
}

2
var key = event.which || event.charCode || event.keyCode
앤 반 로섬

@ anne-van-rossum, event.wich == null && ...null 또는 undefined 만 테스트하십시오. 당신 event.wich || ...을위한 테스트 falsy (정의되지 않은, 널 (null), 거짓, 0, '', 등)
aMarCruz

의도적으로 @aMarCruz Falsy. 예는 bugs.webkit.org/show_bug.cgi?id=16735 웹킷보고와 0. 그리고 나는 확인 ""하거나 []아프게 생각하지 않습니다 .
앤 반 로섬

20

바닐라 자바 ​​스크립트를 사용하는 경우 keyCode는 더 이상 사용되지 않으며 삭제됩니다.

이 기능은 웹 표준에서 제거되었습니다. 일부 브라우저는 여전히이를 지원할 수 있지만 삭제되는 중입니다. 사용하지 말고 가능한 경우 기존 코드를 업데이트하십시오. 결정을 안내하려면이 페이지 하단의 호환성 표를 참조하십시오. 이 기능은 모든 팀에서 작동을 멈출 수 있습니다

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

대신 원하는 동작에 따라 .key 또는 .code를 사용 하십시오 . https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/ko -미국 / 문서 / 웹 / API / 키보드 이벤트 / 키

둘 다 최신 브라우저에서 구현됩니다.


.code 는 키보드의 키의 실제 위치에 해당하는 반면 .key 는 위치에 관계없이 누른 키로 생성 된 문자에 해당합니다.
Christopher

1
'코드'와 '키'모두 최신 브라우저에서 단점이 있습니다. 다른 브라우저의 MDN developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code 에서 "시도해보십시오"예제를 사용하면 IE11 / IE Edge가 'code'및 'key'를 구현하지 않습니다. 구현이 Chrome / FF / Safari의 구현과 일치하지 않습니다 (차이는 주로 이스케이프 및 Enter와 같은 제어 문자 인 것으로 보입니다). 나는 이러한 vagaries를 스스로 기꺼이 설명하지 않으면 라이브러리를 사용하는 것이 가장 쉽다고 생각합니다. 나는 이것이 답이되기를 정말로 원하지만 IE는 이것을
망쳐 놓는다

흠 ... 실제로 크로스 브라우저 방식으로 키를 구현하는 것은 그리 나쁘지 않습니다. 일반 영숫자 키는 값을 반환하고 제어 키 (이스케이프, 입력, 탭 등)는 이전 버전의 사양을 구현하는 IE11 / Edge를 제외하고 대부분의 브라우저에서 동일하게 구현 된 것처럼 보이므로 적어도 각각에 대해 두 가지 가능한 값만 있습니다 키.
Akrikos

나는 사용하는 것이 좋습니다 key대신을 것이 좋습니다 code. 예를 들어, 미디어 제어 키가있는 키보드가있는 경우 재생 / 일시 정지를 누르면 "MediaPlayPause"가 ""로 출력 key됩니다 code.
thdoan

6

이것을보십시오 : https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode

키 누르기 이벤트에서 누른 키의 유니 코드 값은 keyCode 또는 charCode 속성에 저장되며 둘다는 아닙니다. 누른 키가 문자 (예 : 'a')를 생성하면 charCode는 문자 대소 문자를 기준으로 해당 문자의 코드로 설정됩니다. (즉, charCode는 Shift 키를 누르고 있는지 여부를 고려합니다). 그렇지 않으면, 누른 키의 코드가 keyCode에 저장됩니다. keyCode는 항상 keydown 및 keyup 이벤트에서 설정됩니다. 이 경우 charCode는 설정되지 않습니다. keyCode 또는 charCode에 저장되어 있는지 여부에 관계없이 키 코드를 얻으려면 which 속성을 쿼리하십시오. IME를 통해 입력 한 문자는 keyCode 또는 charCode를 통해 등록되지 않습니다.


6

나는 추천 할 것이다 event.key 현재 합니다. MDN 문서 : https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key

event.KeyCode그리고 event.which둘 다 MDN 페이지 상단에 더 이상 사용되지 않는 경고가 있습니다.
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US / docs / Web / API / KeyboardEvent / which

영숫자 키의 경우 event.key 모든 브라우저에서 동일하게 구현 된 것으로 보입니다. 컨트롤 키 (탭, 입력, 이스케이프 등)의 경우 event.keyChrome / FF / Safari / Opera에서 값이 같지만 IE10 / 11 / Edge에서는 값이 다릅니다 (IE는 이전 버전의 사양을 사용하지만 서로 일치합니다. 2018 년 1 월 14 일).

영숫자 키의 경우 검사는 다음과 같습니다.

event.key === 'a'

제어 문자의 경우 다음과 같은 작업을 수행해야합니다.

event.key === 'Esc' || event.key === 'Escape'

여러 브라우저에서 테스트하기 위해 여기 예제를 사용했습니다 (IE10에서 작동하도록 코드 펜으로 열고 편집해야했습니다). https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ 암호

event.code 가능성이 다른 답변으로 언급되었지만 IE10 / 11 / Edge는 구현하지 않으므로 IE 지원을 원하는지 여부입니다.


2

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

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

hotkeys('ctrl+a,ctrl+b,r,f', function(event,handler){
    switch(handler.key){
        case "ctrl+a":alert('you pressed ctrl+a!');break;
        case "ctrl+b":alert('you pressed ctrl+b!');break;
        case "r":alert('you pressed r!');break;
        case "f":alert('you pressed f!');break;
    }
});

단축키는 다음과 같은 수식을 이해 : , shift, option, , alt, ctrl, control, command, 및 .

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


그러나 shim Array.prototype.indexOf를 수행하므로 다른 라이브러리에서 이것을 사용하는 경우 전역 범위를 수정하므로 적합하지 않을 수 있습니다. 또한 더 이상 사용되지 않는 것 같습니다 event.keyCode.
Akrikos

이 라이브러리는 내 Vaio 랩톱에서 Fn을 감지하지 못했습니다.
thdoan

0

Firefox에서 keyCode 속성은 onkeypress 이벤트에서 작동하지 않습니다 (0 만 반환 함). 크로스 브라우저 솔루션의 경우, KeyCode와 함께 which 특성을 사용하십시오. 예 :

var x = event.which || event.keyCode;  // Use either which or keyCode, depending on browser support
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.