jQuery로 클릭 이벤트 중에 키가 눌 렸는지 어떻게 확인할 수 있습니까?


105

jQuery로 클릭 이벤트를 포착하고 동시에 키가 눌 렸는지 알 수 있으므로 키 누르기 이벤트를 기반으로 콜백 함수 내에서 분기 할 수 있습니다.

예를 들면 :

$("button").click(function() {
    if([KEYPRESSED WHILE CLICKED]) {
        // Do something...
    } else {
        // Do something different...
    }
});

이것이 가능합니까 아니면 가능하다면 어떻게 할 수 있습니까?

답변:


174

이벤트 속성에서 shift, alt 및 control 키를 쉽게 감지 할 수 있습니다.

$("button").click(function(evt) {
  if (evt.ctrlKey)
    alert('Ctrl down');
  if (evt.altKey)
    alert('Alt down');
  // ...
});

더 많은 속성 은 quirksmode 를 참조하십시오 . 다른 키를 감지하려면 cletus의 답변을 참조하십시오 .


3
jQuery 이벤트 개체에 해당 속성이 표시되지 않습니다. api.jquery.com/category/events/event-object
cletus

1
페이지에 "원래 이벤트의 대부분의 속성이 복사되어 새 이벤트 객체로 정규화됩니다."라고 말합니다. ctrlKey, altKey 등은 ecmascript 표준 (앞서 언급 한 jquery api 페이지의 첫 번째 링크 참조)의 일부이므로 (적어도 괜찮은 브라우저에서는) 일반적으로 이벤트 객체에도 해당 속성이 설정되어 있습니다.
kkyy

3
Quirks 모드는 이러한 항목이 키 이벤트에 정의 되어 있다고 만 말합니다 . 마우스 이벤트에 대한 언급은 없습니다.

6
을 사용하여 Mac OS X의 명령 키를 감지 할 수도 있습니다 if (e.metaKey) alert('Command down'). 다음은 JS unixpapa.com/js/key.html의
F Lekschas

48

별도로 사용하여 키 상태를 추적해야 keydown()하고 keyup():

var ctrlPressed = false;
$(window).keydown(function(evt) {
  if (evt.which == 17) { // ctrl
    ctrlPressed = true;
  }
}).keyup(function(evt) {
  if (evt.which == 17) { // ctrl
    ctrlPressed = false;
  }
});

키 코드 목록을 참조하십시오 . 이제 다음을 확인할 수 있습니다.

$("button").click(function() {
  if (ctrlPressed) {
    // do something
  } else {
    // do something else
  }
});

6
이 방법의 한 가지 단점은 (더 나은 방법은 아님) ALT 키를 감지하고 사용자가 다른 창으로 ALT-Tabs하면 keyup 이벤트가 다른 응용 프로그램에서 발생했기 때문에 브라우저에서 감지되지 않는다는 것입니다. . 그 시점부터 jquery는 jquery 앱 내에서 keyup 할 때까지 키가 다운되었다고 생각합니다. 이것은 내가 상상할 수있는 한 ALT 키로 만 중요합니다.
Flat Cat

1
맥 OS X의 경우 Cmd를 탭 수 있지만 나는 교장은 여전히 보유하고 생각하는
murftown

1
또는 브라우저 탭 변경을위한 Ctrl + Tab
2017-09-21


3

@Arun Prasad의 천둥을 훔치지 않고 여기에 기본 동작을 중지하기 위해 다시 해싱 한 순수한 JS 스 니펫이 있습니다. 그렇지 않으면 CTL + 클릭을 누르면 새 창이 열립니다.

function Show(event) 
{
  if (event.ctrlKey) 
  {
    alert('Ctrl held down which clicked');
  } 
  else 
  {
    alert('Ctrl NOT pressed');
  }
  return false
}
<p>Hold down CTL on the link to get a different message</p>

<a href="" onclick="return Show(event)">click me</a>

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