जावास्क्रिप्ट के माध्यम से मैक की कमांड कुंजी को कैसे पकड़ता है?


175

Cmdजावास्क्रिप्ट के माध्यम से मैक की कुंजी को कैसे पकड़ता है?



इसके लिए एक जावास्क्रिप्ट-लिब है: keymaster.js ( जेकरी जैसी कोई निर्भरता नहीं)
bmeser

जवाबों:


238

संपादित करें: 2019 की स्थिति के अनुसार e.metaKeyकिया जाता है MDN के अनुसार सभी प्रमुख ब्राउज़रों पर समर्थित

ध्यान दें कि विंडोज पर, हालांकि ⊞ Windowsकुंजी को "मेटा" कुंजी माना जाता है, यह ब्राउज़र द्वारा इस तरह कैप्चर नहीं किया जा सकता है।

यह केवल MacOS / कीबोर्ड पर कमांड कुंजी के लिए है।


Shift/ Alt/ के विपरीत Ctrl, Cmd("Apple") कुंजी को एक संशोधक कुंजी नहीं माना जाता है - इसके बजाय, आपको एक कुंजी दबाए जाने पर और उसके बाद उदास होने पर रिकॉर्ड keydown/ सुनना चाहिए ।keyupevent.keyCode

दुर्भाग्य से, ये प्रमुख कोड ब्राउज़र-निर्भर हैं:

  • फ़ायरफ़ॉक्स: 224
  • ओपेरा: 17
  • WebKit ब्राउज़र (सफारी / क्रोम): 91(लेफ्ट कमांड) या 93(राइट कमांड)

आपको जावास्क्रिप्ट पागलपन: कीबोर्ड ईवेंट्स लेख को पढ़ने में रुचि हो सकती है , जिससे मैंने वह ज्ञान सीखा।


2
जान लें कि ओपेरा अब वेबकिट श्रेणी में भी है। मुझे लगता है कि सिर्फ 91, 93 और 224 के लिए सुनने से काम चल जाएगा। 17 Ctrl है, वैसे। क्या पुराने ओपेरा ने Cmd और Ctrl को अलग नहीं किया है ??
स्टीवन लू

56
ऐसा लगता है कि event.metaKey एक आकर्षण की तरह सफारी, फ़ायरफ़ॉक्स और क्रोम के वर्तमान संस्करणों में काम करता है। IMO यह बहुत स्पष्ट समाधान है।
मिरोस्लाव निदालकोव

5
मिरोस्लाव की टिप्पणी के जवाब में, बस ध्यान दें कि यह केवल keydownघटनाओं पर काम करता है, न कि keyup
नचोकाब

209

event.metaKeyयदि आप कीडड इवेंट्स के साथ काम कर रहे हैं, तो आप इवेंट की विशेषता को भी देख सकते हैं । मेरे लिए अद्भुत काम किया! आप इसे यहाँ आज़मा सकते हैं


यह MacOS पर फ़ायरफ़ॉक्स 4.0.1 के साथ मेरे लिए सेट नहीं लगता है। यह देखते हुए कि स्वीकृत उत्तर और लिंक किए गए संदर्भ दोनों से सहमत हैं कि आपने क्या कहा है, मुझे लगता है कि यह उत्तर गलत है।
जोश ग्लोवर

8
.metaKeyवास्तव में नवीनतम फ़ायरफ़ॉक्स, सफारी और ओपेरा में काम करता है। Chrome में, .metaKeyनियंत्रण पर चालू होता है (कमांड पर नहीं)।
इल्या सेमेनोव

1
FWIW, cmd + e आपकी स्क्रिप्ट में मेरे लिए काम नहीं करता है। Ctrl आपके पास CMD आइकन चलाता है
ऑस्कर गोडसन

1
cmd + e मेरे लिए या तो आग नहीं लगाती (क्रोम)। ctrl + e करता है।
स्पेंसर विलियम्स

23
मुझे लगता है कि ट्रिक (यहां तक ​​कि क्रोम में भी) यह काम करता है, keydownलेकिन इसके लिए keyupया नहीं keypress
फिल्पेरो

15

मैंने पाया कि आप सफारी (7.0: 9537.71) के नवीनतम संस्करण में कमांड कुंजी का पता लगा सकते हैं यदि इसे किसी अन्य कुंजी के साथ संयोजन में दबाया जाए। उदाहरण के लिए, यदि आप ⌘ + x: का पता लगाना चाहते हैं, तो आप x कुंजी का पता लगा सकते हैं और देख सकते हैं कि Event.metaKey सही पर सेट है या नहीं। उदाहरण के लिए:

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

अपने आप पर x दबाने पर यह आउटपुट हो जाएगा 120, false। Pressing + x दबाने पर, यह आउटपुट करेगा120, true

यह केवल सफारी में काम करता है - क्रोम नहीं


2017 में क्या स्थिति है?
सुपरब्यूपर

13

इलिया के डेटा पर आधारित, मैंने मैक पर संशोधक कुंजियों का समर्थन करने के लिए एक वेनिला जेएस लाइब्रेरी लिखी: https://github.com/MichaelZelensky/jsLbooks/blob/master/macKeys.js

बस इसे इस तरह उपयोग करें, जैसे:

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

मैक पर क्रोम, सफारी, फ़ायरफ़ॉक्स, ओपेरा पर परीक्षण किया गया। कृपया जांचें कि क्या यह आपके लिए काम करता है।


8

JQuery का उपयोग करने वाले लोगों के लिए, महत्वपूर्ण घटनाओं से निपटने के लिए एक उत्कृष्ट प्लगइन है:

जीटहब पर jQuery के हॉटकीज़

+ Sऔर Ctrl+ कैप्चर करने के लिए Sमैं इसका उपयोग कर रहा हूं:

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

1
बहुत अच्छा काम करता है। अन्य सभी प्रमुख प्रेस पर भी कब्जा हो जाता है।
फेलिक्स राबे

क्या यह क्रॉस ब्राउज़र समर्थित है?
आदिल मलिक

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.