Wie erfasst man die Befehlstaste eines Mac über JavaScript?

Antworten:

238

BEARBEITEN: Ab 2019 e.metaKeywird in allen gängigen Browsern gemäß MDN unterstützt .

Beachten Sie, dass unter Windows der ⊞ WindowsSchlüssel zwar als "Meta" -Schlüssel betrachtet wird, jedoch nicht von Browsern als solchen erfasst wird.

Dies gilt nur für die Befehlstaste unter MacOS / Tastaturen.


Im Gegensatz zu Shift/ Alt/ Ctrlwird die CmdTaste („Apple“) nicht als Modifizierertaste betrachtet. Stattdessen sollten Sie auf keydown/ hören keyupund aufzeichnen, wenn eine Taste gedrückt und dann basierend auf gedrückt wird event.keyCode.

Leider sind diese Schlüsselcodes browserabhängig:

  • Feuerfuchs: 224
  • Oper: 17
  • WebKit-Browser (Safari / Chrome): 91(linker Befehl) oder 93(rechter Befehl)

Vielleicht möchten Sie den Artikel JavaScript Madness: Keyboard Events lesen , aus dem ich dieses Wissen gelernt habe.

Ilya Semenov
quelle
2
Wissen Sie, dass Opera jetzt auch in der Kategorie Webkit enthalten ist. Ich denke, nur 91, 93 und 224 zu hören, wird den Job erledigen. 17 ist übrigens Strg. Hat die alte Oper Cmd und Ctrl nicht unterschieden?
Steven Lu
55
Es scheint, dass event.metaKey in den aktuellen Versionen von Safari, Firefox und Chrome wie ein Zauber funktioniert. IMO ist es viel klare Lösung.
Miroslav Nedyalkov
5
Beachten Sie als Antwort auf Miroslavs Kommentar nur, dass es nur bei keydownEreignissen funktioniert , nicht bei Ereignissen keyup.
Nachocab
209

Sie können sich auch das event.metaKeyAttribut des Ereignisses ansehen, wenn Sie mit Keydown-Ereignissen arbeiten. Arbeitete wunderbar für mich! Sie können es hier versuchen .

Sonnig
quelle
Das scheint für mich mit Firefox 4.0.1 unter MacOS nicht eingestellt zu sein. Angesichts der Tatsache, dass sowohl die akzeptierte Antwort als auch die verknüpfte Referenz nicht mit dem übereinstimmen, was Sie gesagt haben, halte ich diese Antwort für falsch.
Josh Glover
8
.metaKeyfunktioniert in der Tat in den neuesten Versionen von Firefox, Safari und Opera. Wird in Chrome .metaKeybei Steuerung ausgelöst (nicht bei Befehl).
Ilya Semenov
1
FWIW, cmd + e funktioniert in Ihrem Skript nicht für mich. Strg löst das CMD-Symbol aus, das Sie haben
Oscar Godson
1
cmd + e löst das Ereignis auch für mich nicht aus (Chrome). Strg + E tut es.
Spencer Williams
23
Ich denke, der Trick (auch in Chrome) ist, dass dies funktioniert, keydownaber NICHT für keyupoder keypress.
Philfreo
15

Ich habe festgestellt, dass Sie die Befehlstaste in der neuesten Version von Safari (7.0: 9537.71) erkennen können, wenn sie in Verbindung mit einer anderen Taste gedrückt wird. Wenn Sie beispielsweise ⌘ + x: erkennen möchten, können Sie die x-Taste erkennen UND prüfen, ob event.metaKey auf true gesetzt ist. Beispielsweise:

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

Wenn Sie x alleine drücken, wird dies ausgegeben 120, false. Wenn Sie ⌘ + x drücken, wird ausgegeben120, true

Dies scheint nur in Safari zu funktionieren - nicht in Chrome

Kryptopay
quelle
Wie ist der Status im Jahr 2017?
SuperUberDuper
13

Basierend auf Ilyas Daten habe ich eine Vanilla JS-Bibliothek zur Unterstützung von Modifikatortasten auf dem Mac geschrieben: https://github.com/MichaelZelensky/jsLibraries/blob/master/macKeys.js

Verwenden Sie es einfach so, zB:

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

Getestet auf Chrome, Safari, Firefox, Opera auf Mac. Bitte überprüfen Sie, ob es für Sie funktioniert.

Michael Zelensky
quelle
8

Für Benutzer von jQuery gibt es ein hervorragendes Plugin für die Behandlung von Schlüsselereignissen:

jQuery-Hotkeys auf GitHub

Zum Erfassen von + Sund Ctrl+ verwende Sich Folgendes:

$(window).bind('keydown.ctrl_s keydown.meta_s', function(event) {
    event.preventDefault();
    // Do something here
});
Koen.
quelle
1
Funktioniert zu gut. Alle anderen Tastendrücke werden ebenfalls erfasst.
Felix Rabe
Wird Cross-Browser unterstützt?
Adil Malik
1
Wenn Sie den Link in meiner Antwort besucht hätten, hätten Sie gewusst: github.com/tzuryby/jquery.hotkeys#jquery-compatibility
Koen.
3

Hier ist, wie ich es in AngularJS gemacht habe

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()
Dinis Cruz
quelle