'클릭'이벤트에서 Ctrl / Shift / Alt 키 확인


79

다음 코드에서 어떤 Ctrl / Shift/ Alt키가 눌 렸는지 어떻게 확인할 수 있습니까?

$("#my_id").click(function() {
    if (<left control key is pressed>) { alert("Left Ctrl"); }
    if (<right shift and left alt keys are pressed>) { alert("Right Shift + Left Alt"); }
});

@JeremyBanks KeyboardEvent 위치를 찾고 있습니다 ( 테이블 지원 참조 ) . jQuery에서 jq 이벤트 래퍼를 사용하려면 event.originalEvent.location. 그런 다음 클릭시 구현하는 논리는 그렇게 어렵지 않습니다. 키 다운 / 키업 이벤트에 플래그 / 객체를 설정하고 클릭 할 때 확인하십시오. altGr일관성없는 결과를 제공 할 수있는 키 를 처리 하는 것이 문제 일 수 있습니다 . 내가 시간이 있다면, 나는 대답, 나중에 ... 만들거야
A. 울프

답변:


77

이것은 IE 8에서만 작동하는 모든 브라우저에서 작동하지 않을 것입니다. Microsoft는 어떤 (오른쪽 / 왼쪽) 키를 눌렀는지 확인하는 기능을 구현했습니다. 여기에 링크가 있습니다 http://msdn.microsoft.com/en-us/library/ms534630(VS.85).aspx

또한 브라우저의 keypress, keyup, keydown 이벤트에 대한이 기사를 찾았습니다. http://unixpapa.com/js/key.html

$('#someelement').bind('click', function(event){ 

    if(event.ctrlKey) {
      if (event.ctrlLeft) {
        console.log('ctrl-left'); 
      }
      else {
        console.log('ctrl-right');
      }
    }
    if(event.altKey) {
      if (event.altLeft) {
        console.log('alt-left'); 
      }
      else {
        console.log('alt-right');
      }
    }
    if(event.shiftKey) {
      if (event.shiftLeft) {
        console.log('shift-left'); 
      }
      else
      {
        console.log('shift-right');
      }
    }
  }); 

죄송합니다. Firefox 3.6.3에 관심이 있다고 언급하지 않았습니다. 그에 따라 질문을 업데이트했습니다.
Misha Moroshko

Misha Moroshko. 미안하지만 아직 파이어 폭스에서 할 수있는 방법이 없습니다. 아마도 그것은 미래에 "keyLocation", "keyIdentifier"또는 "shiftLeft"를 구현할 것입니다 .... 나는 거친 제안이 있지만 그것이 작동하는지 확실하지 않습니다. JAVA 애플릿이 오른쪽 및 왼쪽 키 입력을 감지 할 수 있다는 것을 알고 있습니다. 애플릿에서 키 입력을 캡처 한 다음 오른쪽 / 왼쪽 정보를 웹 사이트로 다시 전달할 수 있다면. 어떻게해야하는지 말해 줄 수도 없습니다. 하지만 아이디어입니다. Flash는 JAVA 애플릿의 대안이 될 수 있습니다
John Hartsock

네, 안 될 줄 알았어요. 그러나 지금은 JQuery / HTML DOM 및 Firefox 3.6.3을 사용하는 것이 불가능합니다.
John Hartsock

마찬가지로 Flash Actionscript3로도 할 수 있지만 거기에 가고 싶지 않은 것 같습니다.
mVChr

다른 의견 중 하나에있는 quirksmode 링크는 IE8이 아닌 IE6 +라고 제안합니다.
Stobor

40
$('#someelement').bind('click', function(event){
   if(event.ctrlKey)
      console.log('ctrl');
   if(event.altKey)
      console.log('alt');
   if(event.shiftKey)
      console.log('shift');

});

클릭 이벤트 내에서 왼쪽 / 오른쪽 키를 확인할 수 있는지는 모르겠지만 가능하다고 생각하지 않습니다.


1
Shift 왼쪽과 오른쪽 모두 키 코드가 16입니다. Ctrl (17) 및 alt (18)와 동일

9
DOM3 지원이 왼쪽에서 오른쪽으로 말할 수있을 때까지 기다려야한다고 생각합니다. DOM 3에는 event.keyLocation ( w3.org/TR/DOM-Level-3-Events/… )이 도입되었습니다 .
DaveS

Firefox 3.6.3에 이것의 일부 구현이 가능합니까?
Misha Moroshko

2
왼쪽 / 오른쪽 기능은 아직 Firefox에서 구현되지 않은 것 같습니다. 시프트의 경우 별표 표시 할 수있는 기능 요청이 있습니다. bugzilla.mozilla.org/show_bug.cgi?id=458433 ctrlLeft에는 버그 / 기능 요청도 없습니다. Quirksmode 페이지 (최근 브라우저에 대한 정보는 없음) : quirksmode.org/dom/w3c_events.html#keyprops
Simon B.

7

e.originalEvent.location왼쪽 키에 대해 1을, 오른쪽 키에 대해 2를 반환합니다. 따라서 modifier다음과 같이 어떤 키가 눌 렸는지 감지 할 수 있습니다 . 이것이 당신을 도울 것입니다.

var msg = $('#msg');
$(document).keyup(function (e) {
      if (e.keyCode == 16) {
          if (e.originalEvent.location == 1)
              msg.html('Left SHIFT pressed.');
          else
              msg.html('Right SHIFT pressed.');
      } else if (e.keyCode == 17) {
          if (e.originalEvent.location == 1)
              msg.html('Left CTRL pressed.');
          else
              msg.html('Right CTRL pressed.');
      } else if (e.keyCode == 18) {
          if (e.originalEvent.location == 1)
              msg.html('Left ALT pressed.');
          else
              msg.html('Right ALT pressed.');
        
          e.preventDefault(); //because ALT focusout the element
      }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Press modifier key: </label>
<strong id="msg"></strong>


Chrome에서 잠시 살펴본 결과 여러분과 같은 결과를 얻었습니다. IE OLDTIMER 에 대한 구문을 사용 event.location하거나 event.keyLocation대체합니다 event.ctrlLeft.
Tokimon 2015

event.location을 사용 하는 것은 Chrome에서 왼쪽 키와 오른쪽 키를 구분하는 유일한 방법입니다.
Mac

e.originalEvent.locationChrome과 Firefox에서 나를 위해 일하고 있습니다. @Mac
이브라힘 칸

사용하는 것이 이상해 보입니다 keyup... Ctrl도중에 눌 렸는지 (누르고 있는지) 알고 click싶다면 keydown클릭 리스너에서 확인할 수있는 플래그 를 사용 하고 설정 하고 싶을 것 입니다. 에서 플래그를 재설정합니다 keyup.
Stijn de Witt

7

대부분의 경우에서 ALT, CTRL그리고 SHIFT키 부울 그 키를 누르면 알아보기 위해 작동합니다. 예를 들면 :

var altKeyPressed = instanceOfMouseEvent.altKey

호출되면 true 또는 false를 반환합니다. 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey 참조하십시오.

향후 참조를 metaKey위해 메타 키를 눌렀을 때 작동하는 (NS / firefox 전용) 이라는 이름도 있습니다 .


이것은 아마도 여기에서 가장 좋은 대답 일 것입니다. 흥미롭게도 그것은 찬성 투표가 없습니다.
MarkSkayff

사용자가 기본 설정으로 Linux Mint 18을 사용하는 경우이 간단한 솔루션이 실패 할 수 있다는 점은 주목할 가치가 있습니다. Preferences : Windows : Behavior : Special Key to move and resize windows가 Alt (기본값)로 설정된 경우 Alt 키를 누르면 click이벤트 가 발생 하지 않으므로 altKey속성을 참조하는 함수가 실행 됩니다. 실행되지 않습니다.
Patrick Dark

2

다음 내 댓글 이 가능한 솔루션입니다.

어떤 특정 수정 자 키를 눌렀는지 확인하려면 KeyboardEvent Location을 사용할 수 있습니다 ( 테이블 지원 참조 ).

IE8을 지원하려면 이미 게시 된 솔루션을 사용할 수 있습니다 .

이제 해결 방법은 수정 자 키가 유지되는 관련 속성을 사용하여 전역 개체를 설정하는 것입니다. 물론 전역 객체를 사용하지 않는 다른 방법도 가능합니다.

여기에서 관련 자바 스크립트 리스너 메소드를 사용하여 이벤트를 캡처합니다 (jQuery는 캡처 단계를 지원하지 않음) . keydown/keyup이미 사용중인 코드로 인해 어떤 이유로 이벤트 전파가 중지 되는 경우를 처리하기 위해 이벤트를 캡처 합니다.

/* global variable used to check modifier keys held */
/* Note: if e.g control left key and control right key are held simultaneously */
/* only first pressed key is handled (default browser behaviour?)*/
window.modifierKeys = (function() {
  /* to handle modifier keys except AltGr which is key shortcut for controlRight + alt */
  var mKeys = {};
  /* to fire keydown event only once per key held*/
  var lastEvent, heldKeys = {};
  // capture event to avoid any event stopped propagation
  document.addEventListener('keydown', function(e) {
    if (lastEvent && lastEvent.which == e.which) {
      return;
    }
    lastEvent = e;
    heldKeys[e.which] = true;
    setModifierKey(e);
  }, true);
  // capture event to avoid any event stopped propagation
  document.addEventListener('keyup', function(e) {
    lastEvent = null;
    delete heldKeys[e.which];
    setModifierKey(e);
  }, true);

  function setModifierKey(e) {
    mKeys.alt = e.altKey;
    mKeys.ctrlLeft = e.ctrlKey && e.location === 1;
    mKeys.ctrlRight = e.ctrlKey && e.location === 2;
    mKeys.shiftLeft = e.shiftKey && e.location === 1;
    mKeys.shiftRight = e.shiftKey && e.location === 2;
  }
  return mKeys;
})();

/* on div click, check for global object */
$('.modifierKey').on('click', function() {
  console.log(modifierKeys);
  /* for demo purpose */
  $('.info').text(function() {
    var txt = [];
    for (var p in modifierKeys) {
      if (modifierKeys[p]) txt.push(p);
    }
    return txt.toString();
  });
})
/* for demo purpose */

.info:not(:empty) {
  border: 1px solid red;
  padding: .1em .5em;
  font-weight: bold;
}
.info:not(:empty):after {
  content: " held";
  font-weight: normal;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="modifierKey" tabindex="-1">
  DIV to catch modifier keys on click
</div>
<br>
<span class="info"></span>

참고로 :

  • ALT GRkey는 CTRL-Right&에 대한 바로 가기 키입니다 .ALT
  • 두 개의 indentical modifier 키 (예 : Shift-Left 및 Shift-Rigth 키)를 동시에 누르면 처음 하나만 처리됩니다 (기본 브라우저 동작처럼 보이므로 어쨌든 옳은 것 같습니다!)

2

2020 년에 적합한 답변을 추가하겠다고 생각했습니다.


이제 MouseEvent.getModifierState()이것을 사용할 수도 있습니다 . 작성 당시 대부분의 브라우저 에서 지원됩니다 .

document.addEventListener("click", (evn) => {
  const shift = evn.getModifierState("Shift");
  const ctrl = evn.getModifierState("Control");
  const alt = evn.getModifierState("Alt");

  console.log("Mouse pressed! Modifiers:");
  console.table({shift, ctrl, alt});
});

예

주의 사항 :

  • 특히이 API 왼쪽 및 오른쪽 수정자를 . 당신이 그것에 관심이 있다면, 당신은 운이 좋지 않습니다. 그러나 나는 이것이 소수의 사용 사례에서만 중요하다고 생각합니다.
  • 이 API의 주요 장점 중 하나는 이외의 수정을 지원한다는 것입니다 shift, ctrl하고 alt. 그러나 특정 동작은 고유 한 플랫폼 차이로 인해 여러 OS에서 다소 불규칙합니다. 사용하기 전에 여기 를 확인 하십시오 .

정말 고맙습니다. 이것은 훨씬 더 깨끗합니다!
Austin Burk


0

무엇보다 쉽습니다 : keydown 이벤트를 사용하여 Ctrl(17) 또는 Shift(16)인지 확인한 다음 keyup 이벤트를 사용하여 Enter(13) 인지 확인 하고 Ctrl또는 Shift(키를 누를 때) 취소 Ctrl또는 키 업 전에 누르지 ShiftEnter


0

매력처럼 작동합니다! Chrome, Firefox, IE 및 Edge에서도;) https://jsfiddle.net/55g5utsk/2/

var a=[];
function keyName(p){
    var cases = {16:'Shift',17:'CTRL',18:'Alt'};
    return cases[p] ? cases[p] : 'KeyCode: '+p;
}
function keyPosition(p){
    var cases = {1:'Left',2:'Right'};
    return cases[p] ? cases[p]+' ' : '';
}
$('input').on('keydown',function(e){
    a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode));
})
$('input').on('keyup',function(){
    var c='';
    var removeDuplicates = [];
    $.each(a, function(i, el){
        if ($.inArray(el, removeDuplicates) === -1) {
           removeDuplicates.push(el);
           c=c+(el)+' + ';
        }
    });
    a=[];
    alert(c.slice(0, -3))
});

다음은 클릭 이벤트가있는 버전 http://jsfiddle.net/2pL0tzx9/

var a=[];
function keyName(p){
    var cases = {16:'Shift',17:'CTRL',18:'Alt'};
    return cases[p] ? cases[p] : '';
}
function keyPosition(p){
    var cases = {1:'Left',2:'Right'};
    return cases[p] ? cases[p]+' ' : '';
}
$(document).on('keydown',function(e){
    a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode));
})
$('#my_id').on('click',function(){
    var c='';
    var removeDuplicates = [];
    a =a.filter(function(v){return v!==''});
    $.each(a, function(i, el){
      if ($.inArray(el, removeDuplicates) === -1){
          removeDuplicates.push(el);
          c=c+(el)+' + ';
      }
    });
    if (c) alert(c.slice(0, -3));
    a=[];   
});

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