JavaScript를 통해 Mac의 명령 키를 어떻게 캡처합니까?


답변:


238

편집 : 2019 기준으로 e.metaKey한다 MDN에 따라 모든 주요 브라우저에서 지원 .

Windows에서는 ⊞ Windows키가 "메타"키로 간주 되지만 브라우저에서 캡처하지는 않습니다.

이것은 MacOS / 키보드의 명령 키에만 해당됩니다.


달리 Shift/ Alt/ CtrlCmd( "애플") 키는 수정으로 간주되지 않습니다 키 대신에 귀를 기울여야 keydown/ keyup키를 누르면 다음에 따라 우울 할 때 기록 event.keyCode.

불행히도, 이러한 키 코드는 브라우저에 따라 다릅니다.

  • Firefox : 224
  • 오페라: 17
  • WebKit 브라우저 (Safari / Chrome) : 91(왼쪽 명령) 또는 93(오른쪽 명령)

JavaScript Madness : Keyboard Events 기사를 읽고 관심을 가질 수 있습니다 .


2
Opera는 이제 Webkit 범주에도 속합니다. 91, 93, 224 만 들으면 작업이 완료 될 것입니다. 그런데 17은 Ctrl입니다. 이전 오페라는 Cmd와 Ctrl을 구분하지 않았습니까?
Steven Lu

56
event.metaKey는 현재 버전의 Safari, Firefox 및 Chrome에서 매력처럼 작동하는 것 같습니다. IMO는 매우 명확한 솔루션입니다.
Miroslav Nedyalkov

5
Miroslav의 의견에 대한 답변은 keydown이벤트가 아닌 이벤트 에서만 작동합니다 keyup.
nachocab

209

키 다운 event.metaKey이벤트로 작업하는 경우 이벤트 의 속성을 볼 수도 있습니다. 나를 위해 훌륭하게 일했습니다! 여기서 시도해 볼 수 있습니다 .


MacOS의 Firefox 4.0.1에서는 설정되지 않은 것 같습니다. 수락 된 답변과 연결된 참조가 모두 귀하가 한 말에 동의하지 않는 경우이 답변이 잘못되었다고 생각합니다.
Josh Glover

8
.metaKey실제로 최신 Firefox, Safari 및 Opera에서 작동합니다. Chrome에서는 .metaKey명령이 아닌 제어 에서 트리거합니다.
Ilya Semenov

1
FWIW, cmd + e는 스크립트에서 작동하지 않습니다. 당신이 아이콘을 Ctrl 키는 CMD를 트리거
오스카 대자에게

1
cmd + e는 나에게도 이벤트를 발생시키지 않습니다 (크롬). ctrl + e는 않습니다.
스펜서 윌리엄스

23
트릭은 (Chrome에서도) 이것이 또는 에 keydown대해서는 작동 하지 않는다고 생각합니다 . keyupkeypress
philfreo

15

다른 키와 함께 누르면 최신 버전의 Safari (7.0 : 9537.71)에서 명령 키를 감지 할 수 있습니다. 예를 들어, ⌘ + x :를 감지하려면 x 키를 감지하고 event.metaKey가 true로 설정되어 있는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

var key = event.keyCode || event.charCode || 0;
console.log(key, event.metaKey);

자체적으로 x를 누르면을 출력 120, false합니다. ⌘ + x를 누르면 출력됩니다120, true

이것은 Chrome이 아닌 Safari에서만 작동하는 것 같습니다.


2017 년의 상태는 어떻습니까?
SuperUberDuper

13

Ilya의 데이터를 바탕으로 Mac에서 수정 키를 지원하기 위해 Vanilla JS 라이브러리를 작성했습니다. https://github.com/MichaelZelensky/jsLibraries/blob/master/macKeys.js

다음과 같이 사용하십시오.

document.onclick = function (event) {
  if (event.shiftKey || macKeys.shiftKey) {
    //do something interesting
  }
}

Chrome, Safari, Firefox, Mac의 Opera에서 테스트되었습니다. 그것이 당신을 위해 작동하는지 확인하십시오.


8

jQuery를 사용하는 사람들에게는 주요 이벤트를 처리하기위한 훌륭한 플러그인이 있습니다.

GitHub의 jQuery 단축키

+ SCtrl+ 를 캡처하려면 다음을 S사용합니다.

$(window).bind('keydown.ctrl_s keydown.meta_s', function(event) {
    event.preventDefault();
    // Do something here
});

1
너무 잘 작동합니다. 다른 모든 키 누름도 캡처됩니다.
Felix Rabe

크로스 브라우저가 지원됩니까?
Adil Malik

1
내 대답의 링크를 방문한 경우 github.com/tzuryby/jquery.hotkeys#jquery-compatibility
Koen을

3

다음은 AngularJS에서 어떻게했는지입니다.

app = angular.module('MM_Graph')

class Keyboard
  constructor: ($injector)->
    @.$injector  = $injector
    @.$window    = @.$injector.get('$window')                             # get reference to $window and $rootScope objects
    @.$rootScope = @.$injector.get('$rootScope')

  on_Key_Down:($event)=>
    @.$rootScope.$broadcast 'keydown', $event                             # broadcast a global keydown event

    if $event.code is 'KeyS' and ($event.ctrlKey or $event.metaKey)       # detect S key pressed and either OSX Command or Window's Control keys pressed
      @.$rootScope.$broadcast '', $event                                  # broadcast keyup_CtrS event
     #$event.preventDefault()                                             # this should be used by the event listeners to prevent default browser behaviour

  setup_Hooks: ()=>
    angular.element(@.$window).bind "keydown", @.on_Key_Down              # hook keydown event in window (only called once per app load)
    @

app.service 'keyboard', ($injector)=>
  return new Keyboard($injector).setup_Hooks()

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