Как захватить командный ключ Mac через JavaScript?
Как получить ключ Cmd для Mac через JavaScript?
13 ответов
В отличие от Shift/Alt/Ctrl, клавиша Cmd ("Apple") не считается клавишей-модификатором - вместо этого вы должны слушать keydown
/keyup
и записывать, когда клавиша нажата, а затем нажата на основе event.keyCode
,
К сожалению, эти коды клавиш зависят от браузера:
- Fire Fox:
224
- Opera:
17
- Браузеры WebKit (Safari / Chrome):
91
(Левая команда) или93
(Правая команда)
Возможно, вам будет интересно прочитать статью " Безумие JavaScript: события клавиатуры", из которой я узнал об этом.
Вы также можете посмотреть на event.metaKey
атрибут на событие, если вы работаете с событиями keydown. Работал чудесно для меня! Вы можете попробовать это здесь.
Я обнаружил, что вы можете обнаружить командную клавишу в последней версии 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
Основываясь на данных Ильи, я написал библиотеку 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. Пожалуйста, проверьте, работает ли он для вас.
keyCode
а также
which
теперь устарели , поэтому рекомендуется избегать ответов, которые используют их здесь.
Один из способов сделать это сейчас — использовать
key
свойство аргумента события, которое поставляется с DOM
keyup
а также
keypress
События. Вот простой пример того, как это сделать:
document.onkeypress = (event) => {
if (event.key === 'Meta') {
console.log("Mac or Windows key was pressed!");
} else {
console.log("Another key was pressed")
}
}
Это сработает при нажатии cmdклавиши на Mac (см. Мета в документах MDN ). Единственное, что следует здесь отметить, это то, что он также будет срабатывать при нажатии клавиши Windows, а клавиатура/ОС пользователя поддерживает это.
Если вам нужно более детальное понимание того, какая клавиша Meta была нажата, вы можете использовать
code
свойство на событие, которое может быть либоMetaLeft
или же
MetaRight
в зависимости от того, какая физическая метаклавиша ( cmd) была нажата.
Для этого есть javascript-библиотека: keymaster.js
(нет таких зависимостей, как jquery)
Для людей, использующих jQuery, есть отличный плагин для обработки ключевых событий:
Горячие клавиши jQuery на GitHub
Для захвата ⌘+S и Ctrl+S я использую это:
$(window).bind('keydown.ctrl_s keydown.meta_s', function(event) {
event.preventDefault();
// Do something here
});
Вот как я это сделал в 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()
var element = //the DOM element to listen for the key on.
element.onkeyup = function(e) {
if(e.metaKey) {
//command key was pressed
}
}
СKeyboardEvent.metaKey: boolean
fromEvent(window, 'keydown').pipe(takeUntil(this._ngUnsubscribe)).subscribe(
(res: KeyboardEvent) => {
console.log(res.metaKey && res.key === 'Enter');
}
);
Этот пример предназначен для fromEvent RxJS, но применим к любому KeyboardEvent.
document.addEventListener('keydown', (e) => {
if((e.key == 'Meta' && /Mac OS/.test(navigator.userAgent)) || e.ctrlKey) {
// CTRL or CMD pressed
}
})
Это шоу захватывает команду Mac и Ctrl Windows.
#команда Mac
$("#my_input").on('change keyup input', function() {
var e = window.event || e; var key = e.keyCode; if(key == 93) {
alert("Hello");
}
});
#Windows Ctrl
$("#my_input").on('change keyup input', function() {
var e = window.event || e; var key = e.keyCode; if(key == 17) {
alert("Hello");
}
});
#Оба
$("#my_input").on('change keyup input', function() {
var e = window.event || e; var key = e.keyCode; if(key == 17 || key == 93) {
alert("Hello");
}
});
Если вы используете Vuejs, просто сделайте это плагином vue-shortkey, все будет просто
https://www.npmjs.com/package/vue-shortkey
v-shortkey="['meta', 'enter']"·
@shortkey="metaEnterTrigged"