Как захватить ключ командной строки Mac через JavaScript?

Как захватить Mac Cmd с помощью JavaScript?

Ответ 1

В отличие от Shift/Alt/Ctrl, клавиша Cmd ("Apple") не считается клавишей-модификатором - вместо этого вы должны слушать keydown/keyup и записывать при нажатии клавиши а затем в депрессии на основе event.keyCode.

К сожалению, эти коды клавиш зависят от браузера:

  • Firefox: 224
  • Опера: 17
  • Браузеры WebKit (Safari/Chrome): 91 (левая команда) или 93 (правая команда)

Возможно, вам будет интересно прочитать статью JavaScript Madness: Keyboard Events, из которой я узнал об этом.

Ответ 2

Вы также можете посмотреть на атрибут event.metaKey в событии, если вы работаете с событиями нажатия клавиш. Работал чудесно для меня! Вы можете попробовать это здесь.

Ответ 3

Я обнаружил, что вы можете обнаружить ключ команды в последней версии Safari (7.0: 9537.71), если он нажат вместе с другим ключом. Например, если вы хотите обнаружить ⌘ + x:, вы можете обнаружить ключ x И проверить, установлено ли для event.metaKey значение true. Например:

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

При нажатии x на него будет выводиться 120, false. При нажатии ⌘ + x выводится 120, true

Это похоже, похоже, работает в Safari - не Chrome

Ответ 4

Основываясь на данных Ilya, я написал библиотеку Vanilla JS для поддержки клавиш-модификаторов на Mac: https://github.com/MichaelZelensky/jsLibraries/blob/master/macKeys.js

Просто используйте его, например:

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

Протестировано в Chrome, Safari, Firefox, Opera на Mac. Проверьте, работает ли он для вас.

Ответ 5

Для этого есть javascript-lib: keymaster.js

(без зависимостей, таких как jquery)

Ответ 6

Для людей, использующих jQuery, есть отличный плагин для обработки ключевых событий:

Горячие клавиши jQuery на GitHub

Для захвата + S и Ctrl + S я использую это:

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

Ответ 7

Вот как я это сделал в 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 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()

Ответ 8

если вы используете Vuejs, просто сделайте это с помощью плагина vue-shortkey, все будет просто

https://www.npmjs.com/package/vue-shortkey

v-shortkey="['meta', 'enter']"·
@shortkey="metaEnterTrigged"