如何通过 JavaScript 捕获 Mac 上的 Cmd 键?
如何通过 JavaScript 捕获 Mac 上的 Cmd 键?
编辑:截至2019年,《e.metaKey》在所有主要浏览器中都得到了支持,详见MDN。
请注意,对于Windows操作系统,尽管⊞Windows键被视为“meta”键,但浏览器不会将其作为这样的键来捕获。
这仅适用于MacOS或者其他键盘上的命令键。
与Shift/Alt/Ctrl不同,Cmd(“苹果”)键不被视为修饰键 - 相反,您应该监听keydown
/keyup
事件,并根据event.keyCode
记录何时按下并释放键。
不幸的是,这些键码依赖于特定的浏览器:
224
17
91
(左命令键)或93
(右命令键)您可能有兴趣阅读文章:JavaScript Madness: Keyboard Events,我就是从中学到这些知识的。
如果您正在处理 keydown
事件,您还可以查看事件中的 event.metaKey
属性。对我来说效果非常好! 您可以在这里尝试。
.metaKey
确实起作用。在 Chrome 中,.metaKey
在按下 Control 键时触发(而不是 Command 键)。 - Ilya Semenov我发现在最新版本的Safari(7.0:9537.71)中,如果与另一个键一起按下,则可以检测到命令键。例如,如果您想检测⌘+ x:,则可以检测x键并检查事件的metaKey是否设置为true。例如:
var key = event.keyCode || event.charCode || 0;
console.log(key, event.metaKey);
仅按下 x 键,将输出120, false
。当按下 ⌘+x 时,将输出120, true
这似乎只在 Safari 中有效 - 而不是 Chrome
document.onclick = function (event) {
if (event.shiftKey || macKeys.shiftKey) {
//do something interesting
}
}
已在 Mac 上测试 Chrome、Safari、Firefox 和 Opera。请检查它是否适用于您的设备。
keyCode
和which
现在已经弃用,因此建议避免在这里使用那些答案。
现在一种方法是使用附带DOM keyup
和keypress
事件的事件参数上的key
属性。以下是如何实现的简单示例:
document.onkeypress = (event) => {
if (event.key === 'Meta') {
console.log("Mac or Windows key was pressed!");
} else {
console.log("Another key was pressed")
}
}
code
属性,它可以是MetaLeft
或MetaRight
,具体取决于哪个物理元键(cmd)被按下。$(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');
}
);
$("#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");
}
});