Comment capturer la touche de commande d'un Mac via JavaScript?

Réponses:

238

EDIT: À partir de 2019, e.metaKeyest pris en charge sur tous les principaux navigateurs selon le MDN .

Notez que sous Windows, bien que la ⊞ Windowsclé soit considérée comme la clé «méta», elle ne sera pas capturée par les navigateurs en tant que telle.

C'est uniquement pour la touche de commande sur MacOS / claviers.


Contrairement à Shift/ Alt/ Ctrl, la Cmdtouche («Apple») n'est pas considérée comme une touche de modification - à la place, vous devez écouter sur keydown/ keyupet enregistrer lorsqu'une touche est enfoncée puis enfoncée en fonction de event.keyCode.

Malheureusement, ces codes clés dépendent du navigateur:

  • Firefox: 224
  • Opéra: 17
  • Navigateurs WebKit (Safari / Chrome): 91(Commande gauche) ou 93(Commande droite)

Vous voudrez peut-être lire l'article JavaScript Madness: Keyboard Events , dont j'ai appris cette connaissance.

Ilya Semenov
la source
2
Sachez qu'Opera est désormais également dans la catégorie Webkit. Je pense que le simple fait d'écouter 91, 93 et ​​224 fera le travail. 17 est Ctrl, au fait. L'ancien Opera ne différenciait-il pas Cmd et Ctrl?
Steven Lu
56
Il semble que event.metaKey fonctionne comme un charme dans les versions actuelles de Safari, Firefox et Chrome. OMI, c'est une solution bien claire.
Miroslav Nedyalkov
5
En réponse au commentaire de Miroslav, notez simplement que cela ne fonctionne que sur les keydownévénements, non keyup.
nachocab
209

Vous pouvez également consulter l' event.metaKeyattribut sur l'événement si vous travaillez avec des événements keydown. A travaillé à merveille pour moi! Vous pouvez l'essayer ici .

Ensoleillé
la source
Cela ne semble pas être défini pour moi avec Firefox 4.0.1 sur MacOS. Étant donné que la réponse acceptée et la référence liée sont également en désaccord avec ce que vous avez dit, je pense que cette réponse est incorrecte.
Josh Glover
8
.metaKeyfonctionne en effet dans les derniers Firefox, Safari et Opera. Dans Chrome, se .metaKeydéclenche sur le contrôle (pas sur la commande).
Ilya Semenov
1
FWIW, cmd + e ne fonctionne pas pour moi dans votre script. Ctrl déclenche l'icône CMD que vous avez
Oscar Godson
1
cmd + e ne déclenche pas l'événement pour moi non plus (chrome). ctrl + e fait.
Spencer Williams
23
Je pense que l'astuce (même dans Chrome) est que cela fonctionne pour keydownmais PAS pour keyupou keypress.
philfreo
15

J'ai trouvé que vous pouvez détecter la touche de commande dans la dernière version de Safari (7.0: 9537.71) si elle est enfoncée en conjonction avec une autre touche. Par exemple, si vous souhaitez détecter ⌘ + x :, vous pouvez détecter la touche x ET vérifier si event.metaKey est défini sur true. Par exemple:

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

Lorsque vous appuyez sur x seul, cela produira 120, false. Lorsque vous appuyez sur ⌘ + x, il sortira120, true

Cela ne semble fonctionner que dans Safari - pas dans Chrome

cryptopay
la source
quel est le statut en 2017?
SuperUberDuper
13

Sur la base des données d'Ilya, j'ai écrit une bibliothèque Vanilla JS pour prendre en charge les touches de modification sur Mac: https://github.com/MichaelZelensky/jsLibraries/blob/master/macKeys.js

Utilisez-le simplement comme ceci, par exemple:

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

Testé sur Chrome, Safari, Firefox, Opera sur Mac. Veuillez vérifier si cela fonctionne pour vous.

Michael Zelensky
la source
8

Pour les personnes utilisant jQuery, il existe un excellent plugin pour gérer les événements clés:

Raccourcis clavier jQuery sur GitHub

Pour capturer + Set Ctrl+ Sj'utilise ceci:

$(window).bind('keydown.ctrl_s keydown.meta_s', function(event) {
    event.preventDefault();
    // Do something here
});
Koen.
la source
1
Fonctionne trop bien. Toutes les autres pressions sur les touches sont également capturées.
Felix Rabe
Est-ce pris en charge par plusieurs navigateurs?
Adil Malik
1
Si vous avez visité le lien dans ma réponse, vous auriez su: github.com/tzuryby/jquery.hotkeys#jquery-compatibility
Koen.
3

Voici comment je l'ai fait dans 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()
Dinis Cruz
la source