JS / jQuery에서 화살표 키 바인딩


418

Javascript 및 / 또는 jQuery에서 왼쪽 및 오른쪽 화살표 키에 함수를 바인딩하는 방법은 무엇입니까? jQuery 용 js-hotkey 플러그인을 보았습니다 (특정 키를 인식하기 위해 인수를 추가하기 위해 내장 바인드 함수를 래핑했습니다).하지만 화살표 키를 지원하지 않는 것 같습니다.


답변:


541
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

IE8을 지원해야하는 경우 함수 본문을로 시작하십시오 e = e || window.event; switch(e.which || e.keyCode) {.


(편집 2020)
참고 KeyboardEvent.which지금은 사용되지 않습니다. 화살표 키를 감지하는보다 현대적인 솔루션을 사용하여이 예제를KeyboardEvent.key 참조하십시오 .


28
가장 좋은 대답입니다. 용도 e.whichjQuery를 등 사용, 크로스 브라우저를위한 권장 e.preventDefault()대신 return false( return falseJQuery와 이벤트 핸들러를 트리거 모두 e.preventDefault()e.stopPropagation()이벤트가 그들에게 전파되지 않기 때문에 이후 추가 이벤트가 실패 할 것입니다 두 번째있는), 그리고에 스위치의 끝은 다른 키 사용을 방해하지 않기 위해 찾고있는 키가 아닌 다른 키이면 호출 하지 않고 반환 e.preventDefault()되며 대신 $.ui.keyCode.DOWN숫자 와 비교합니다 (MUCH 빠름).
Jimbo Jonny 2

2
Nathan : 모든 키 코드가 브라우저간에 일치하는 것은 아니지만 화살표 키는 일부 키 코드입니다. 여기를보십시오 : stackoverflow.com/questions/5603195/…
Sygmoral

1
@MichaelScheper-1) 변수! = 상수, 변경 여부와 상관없이 상수 ... 엔진은 jQuery가 상수를 사용할 수있을 정도로 ES6 상수가 유비쿼터스 할 때까지 엔진은 변수를 var처럼 취급해야합니다 .2) 숫자는 그렇지 않습니다 바로 옆에 의견이있을 때 정말 마법의 숫자가 무엇인지, 그리고 3) ... 계속
Jimbo Jonny

2
... 3)에 액세스 할 때 $.ui.keyCode.DOWN당신을 찾아 $, 그것을 찾는 수준을 올라가고 ... 찾고, 당신의 어휘 범위에 포함되지 $전역 범위에서까지 반복, 세계에서 찾을 window액세스 $, 액세스 창 uiwindow.$액세스 keyCodewindow.$.ui액세스 DOWN에가 window.$.ui.keyCode비교하려는 프리미티브 값에 도착, 후 비교 실제 작업을 수행. 그 속도가 당신에게 중요한지 아닌지는 개인적인 결정이지만, 나는 단지 기본 요소를 쉽게 쓰거나 주석을 달 수있는 상황이있을 때 4 단계의 접근을 피하는 경향이 있습니다.
Jimbo Jonny

1
@NathanArthur 여기 나는 키보드의 키 코드를 테스트하기 위해이 좋은 온라인 도구를 발견 keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
리카르도 볼프

451
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

문자 코드 :

37-왼쪽

38-위로

39-오른쪽

40-아래로


4
반품 목적이 있습니까?
Alex S

19
추가 키 다운 이벤트가 발생하는 것을 중지합니다.
s_hewitt

9
그림자 : 아니요, 키 다운 이벤트가 다른 DOM 요소에서 발생하지 않도록합니다.
JasonWoof

3
39도 아포스트로피가 아닌가?
Paul D. Waite

25
jQuery를 사용 e.which하는 경우 e.keyCode더 많은 브라우저 지원 보다는 사용하십시오 . 아래 내 의견을 참조하십시오.
Sygmoral

108

화살표 키의 keyCode를 사용할 수 있습니다 (왼쪽, 위, 오른쪽 및 아래의 경우 37, 38, 39 및 40).

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

위의 예를 확인 하십시오 .


1
|| 사용에 대해 잘 모르겠습니다. 0 행 또는 0이 아닌 구현 이외의 값이 구체적이지 않으며 보장되지 않습니까? 나는 다음과 같은 것을 더 사용할 것이다. var keyCode = (e.keyCode? e.keyCode : e.which); 케이스에 읽을 수있는 이름을주기 위해 화살표 오브젝트를 사용하는 경우 +1
Mnebuerquo

6
jQuery를 사용하는 경우 e.which를 테스트 할 필요가 없습니다. The event.which property normalizes event.keyCode and event.charCode- api.jquery.com
JCM

키 이벤트 리스너를 테이블에 배치하려고하는데 작동하지 않습니다. 주요 이벤트 리스너를 지원하는 선택기 유형이 제한되어 있습니까?
Arman Bimatov

23

이것은 약간 늦었지만 핫키에는 매우 큰 버그가있어 하나 이상의 핫키를 요소에 연결하면 이벤트가 여러 번 실행됩니다. 일반 jQuery를 사용하십시오.

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2
ui 키 코드 객체 사용시 +1 37, 38, 39 또는 40보다 이해하기가 훨씬 쉽습니다. jQuery 문서에서 명시 적으로 브라우저 차이점을 설명하기 위해 e.thing을 사용한다고 명시 할 때 왜 최상위 답변이 e.keyCode를 사용하는지 잘 모르겠습니다. 이 답변이 제대로 된 것으로 더 잘 인식되기를 바랍니다.
없음

2
모든 키를 누를 때마다 $ .ui.keyCode.DOWN을 사용하면 숫자를 사용하는 것보다 훨씬 느립니다. 명확성을 염려하는 경우 특히 키를 누를 때마다 실행되어야하므로 주석을 추가하십시오.
Jimbo Jonny

16

나는 단순히 다른 답변에서 최고의 비트를 결합했습니다.

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1
"ui"는 어디에서 오는가? "TypeError : $ .ui is undefined"편집 중-JQuery UI가 누락되었습니다. 로드했습니다-더 이상 오류가 없습니다.
코더

3
그는 분명히 열거 형이 있어야하는 jQuery UI를 사용하고 있습니다. 나는 그것을 위해 jQuery UI를 포함하지 않을 것이다.
Jethro Larson

14

KeyboardJS를 사용할 수 있습니다. 나는 이와 같은 작업을 위해 라이브러리를 작성했습니다.

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });

라이브러리를 확인하십시오 => http://robertwhurst.github.com/KeyboardJS/


14

일반 자바 스크립트를 사용하는 간결한 솔루션 (제안 된 개선을 위해 Sygmoral에 감사) :

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 39:
            alert('right');
            break;
    }
};

https://stackoverflow.com/a/17929007/1397061 도 참조 하십시오 .


아마 또한 바인딩을 통해 가치가document.addEventListener('keydown', myFunction);
nathanbirrell

9

jQuery.HotKeys가 화살표 키를 지원하지 않습니까? IE7, Firefox 3.5.2 및 Chrome 2.0.172에서 테스트했을 때 왼쪽, 오른쪽, 위 및 아래로 작동하는 것을 관찰하기 전에 데모를 엉망으로 만들었습니다 ...

편집 : jquery.hotkeys가 Github로 재배치 된 것으로 보입니다 : https://github.com/jeresig/jquery.hotkeys


다른 라이브러리를 기반으로한다고 말한 곳을 읽고 있었고 지원되는 키 목록이 여전히 적용되었다고 가정했습니다.
Alex S


4

오른쪽 또는 왼쪽으로 이동하는 순수한 js의 예

        window.addEventListener('keydown', function (e) {
            // go to the right
            if (e.keyCode == 39) {

            }
            // go to the left
            if (e.keyCode == 37) {

            }
        });

3

jQuery 바인드를 사용할 수 있습니다.

$(window).bind('keydown', function(e){
    if (e.keyCode == 37) {
        console.log('left');
    } else if (e.keyCode == 38) {
        console.log('up');
    } else if (e.keyCode == 39) {
        console.log('right');
    } else if (e.keyCode == 40) {
        console.log('down');
    }
});

2

다음을 통해 arrow key눌림 여부를 확인할 수 있습니다 .

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) { 
       alert( "arrowkey pressed" );
       return false;
    }
});

0

다른 객체 선택에 대해서만 화살표를 사용할 수 없도록하십시오. 실제로 다른 객체 LOL을 테스트하지 않았습니다. 그러나 페이지 및 입력 유형에서 화살표 이벤트를 중지 할 수 있습니다.

"kepress" "keydown"및 "keyup"이벤트에서 "e.preventDefault ()"또는 "return false"를 사용하여 SELECT 객체의 값을 변경하기 위해 화살표를 좌우로 차단하려고 시도했지만 여전히 객체 값을 변경합니다. 그러나 이벤트는 여전히 화살표를 눌렀 음을 알려줍니다.


0

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

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

hotkeys('right,left,up,down', function(e, handler){
    switch(handler.key){
        case "right":console.log('right');break
        case "left":console.log('left');break
        case "up":console.log('up');break
        case "down":console.log('down');break
    }
});

0

입력에 집중할 때 화살표 키를 사용하여 숫자 입력을 +1 또는 -1하는 간단한 방법을 찾고 왔습니다. 나는 좋은 대답을 찾지 못했지만 다음 코드를 훌륭하게 작동시켜 사이트 전체에 적용했습니다.

$("input").bind('keydown', function (e) {
    if(e.keyCode == 40 && $.isNumeric($(this).val()) ) {
        $(this).val(parseFloat($(this).val())-1.0);
    } else if(e.keyCode == 38  && $.isNumeric($(this).val()) ) { 
        $(this).val(parseFloat($(this).val())+1.0);
    }
}); 

-1

커피와 Jquery로

  $(document).on 'keydown', (e) ->
    switch e.which
      when 37 then console.log('left key')
      when 38 then console.log('up key')
      when 39 then console.log('right key')
      when 40 then console.log('down key')
    e.preventDefault()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.