Як зафіксувати командний ключ Mac через JavaScript?


Відповіді:


238

EDIT: Станом на 2019 рік , e.metaKeyбуде підтримуватися на всіх основних браузерах , як в відповідно до MDN .

Зауважте, що в Windows, хоча ⊞ Windowsключ вважається "мета" клавішею, він не збирається захоплювати браузери як такі.

Це лише для командної клавіші на MacOS / клавіатурах.


На відміну від Shift/ Alt/ Ctrl, Cmdклавіша ("Apple") не вважається клавішею модифікатора - замість цього вам слід слухати keydown/ keyupзаписувати, коли натискати клавішу та потім натискати клавішу event.keyCode.

На жаль, ці ключові коди залежать від браузера:

  • Firefox: 224
  • Опера: 17
  • Веб-браузери (Safari / Chrome): 91(команда зліва) або 93(команда праворуч)

Можливо, вам буде цікаво прочитати статтю JavaScript Madness: Keyboard Events , з якої я дізнався ці знання.


2
Знайте, що Opera зараз також належить до категорії Webkit. Я думаю, що лише прослухавши 91, 93 та 224, вийде робота. 17, до речі, Ctrl. Чи стара Опера не розмежовувала Cmd та Ctrl ??
Стівен Лу

56
Здається, що event.metaKey працює в нинішніх версіях Safari, Firefox та Chrome як шарм. ІМО це дуже зрозуміле рішення.
Мирослав Недялков

5
У відповідь на коментар Мирослава, просто зауважте, що він працює лише на keydownподії, а не keyup.
nachocab

209

Ви також можете переглянути event.metaKeyатрибут події, якщо ви працюєте з подіями клавіш. Чудово працював для мене! Ви можете спробувати тут .


Здається, це не встановлено для мене з Firefox 4.0.1 на MacOS. Зважаючи на те, що прийнята відповідь та пов'язане посилання не згодні з тим, що ви сказали, я вважаю, що ця відповідь є невірною.
Джош Гловер

8
.metaKeyдійсно працює в останніх Firefox, Safari та Opera. У Chrome .metaKeyспрацьовує на Control (не на Command).
Ілля Семенов

1
FWIW, cmd + e не працює для мене у вашому сценарії. Ctrl запускає наявний у вас значок CMD
Оскар Годсон

1
cmd + e також не запускає події для мене (хром). ctrl + e робить.
Спенсер Вільямс

23
Я думаю, що фокус (навіть у Chrome) полягає в тому, що це працює, keydownале НЕ для keyupабо keypress.
philfreo

15

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

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

Якщо натиснути x самостійно, це виведе 120, false. Якщо натиснути ⌘ + x, воно виведе120, true

Це, здається, працює в Safari - не в Chrome


який статус у 2017 році?
SuperUberDuper

13

Спираючись на дані Іллі, я написав бібліотеку 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. Перевірте, чи працює він для вас.


8

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

гарячі клавіші jQuery на GitHub

Для захоплення + Sі Ctrl+ Sя використовую це:

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

1
Працює надто добре. Усі інші натискання клавіш також захоплюються.
Фелікс Рабе

Чи підтримується перехресний браузер?
Аділ Малик

1
Якщо ви зайшли
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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.