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.


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 .


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


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.


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
});

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()

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.