2010-10-10 3 views

Antwort

179

Im Gegensatz zu Shift/Alt/Ctrl wird die Mac/Apple-Taste nicht als Modifier-Taste betrachtet - stattdessen sollten Sie Keydown/Key-up einhängen und aufnehmen, wenn eine Taste gedrückt und dann auf event.keyCode gedrückt wird.

Leider sind diese Tastencodes sind Browser-abhängig:

Firefox: 224 
Opera: 17 
WebKit (Safari/Chrome): 91 (Left Apple) or 93 (Right Apple) 

Sie könnten in der Lektüre dieses Artikels interessieren: JavaScript Madness: Keyboard Events aus dem gemeistert ich dieses Wissen.

+7

Wow, das ist, was ich hören wollte. Spasibo, Ilya;) – DataGreed

+3

Wahnsinn in der Tat ... aber diese Antwort ist genau richtig ... –

+1

Wissen, dass Opera jetzt auch unter der Webkit-Kategorie ist. Ich glaube, ich höre einfach nur auf 91, 93 und 224, um den Job zu erledigen. 17 ist übrigens Ctrl. Hat die alte Opera nicht zwischen Cmd und Ctrl unterschieden? –

153

Sie können auch das Attribut event.metaKey für das Ereignis anzeigen, wenn Sie mit Keydown-Ereignissen arbeiten. Arbeitete wunderbar für mich! You can try it here.

+0

Das scheint mir mit Firefox 4.0.1 auf MacOS nicht zu gelten. Angesichts der Tatsache, dass die akzeptierte Antwort und die verknüpfte Referenz nicht mit dem übereinstimmen, was Sie auch gesagt haben, halte ich diese Antwort für falsch. –

+0

Die akzeptierte Antwort gibt einen anderen, schmerzhafteren Weg, um es zum Laufen zu bringen, während die verknüpfte Referenz sagt: "Gemäß dem DOM 3-Standard sollte der Option-Schlüssel auf dem Macintosh event.altKey aktivieren und die Befehlstaste sollte das Ereignis aktivieren. metaKey. Diese Attribute scheinen auf allen getesteten modernen Browsern korrekt zu funktionieren "! Die Antwort funktioniert bei Firefox 5.0 auf MacOS. Ich werde versuchen, es in älteren Versionen zu testen. – Sunny

+0

Auch die angenommene Antwort sagt fälschlicherweise, dass "Mac/Apple Key nicht als Modifikatortaste gilt", obwohl die angegebene Referenz das Gegenteil sagt! [Hier ist ein Skript] (http://edit.sunfox.org/metakey.html), das den '.metaKey' Modifikator zeigt, der unter Mac Firefox 3.6.3 -> 5.0 funktioniert. – Sunny

5

Für Menschen jQuery verwenden, gibt es ein ausgezeichnetes Plugin für den Umgang mit wichtigen Ereignissen:

jQuery hotkeys on GitHub

Für + S und Ctrl +S Ich verwende diese Erfassung :

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

Funktioniert zu gut. Alle anderen Tastendrücke werden ebenfalls erfasst. –

+0

Wird Cross Browser unterstützt? –

+0

Wenn Sie den Link in meiner Antwort besucht haben, hätten Sie gewusst: https://github.com/tzuryby/jquery.hotkeys#jquery-compatibility –

9

Ich habe festgestellt, dass Sie können Erkennen Sie die Befehlstaste in der neuesten Version von Safari (7.0: 9537.71), wenn sie in Verbindung mit einem anderen Schlüssel gedrückt wird. Wenn Sie z. B. ⌘ + x: erkennen möchten, können Sie den x-Schlüssel erkennen und prüfen, ob event.metaKey auf "true" gesetzt ist. Zum Beispiel:

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

Beim Drücken x auf seine eigenen, dieser Willen Ausgang 120, false. Wenn ⌘ drücken + x, wird es Ausgabe 120, true

Dies scheint nur in Safari zu arbeiten - nicht Chrome

+0

Scheint so, als würde * * in Chrome in einer Keydown-Veranstaltung funktionieren. –

+0

Wie ist der Stand 2017? – SuperUberDuper

6

Basierend auf Ilyas Daten, schrieb ich eine Vanille JS-Bibliothek für Zusatztasten auf dem Mac unterstützt: https://github.com/MichaelZelensky/jsLibraries/blob/master/macKeys.js

einfach es wie folgt verwendet werden, zB:

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

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

2

Hier ist, wie ich tat es in 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() 
Verwandte Themen