如何通过JavaScript捕获Mac的命令键?


Answers:


238

编辑:截至2019年,e.metaKey支持所有主流浏览器按照该MDN

请注意,在Windows上,尽管该⊞ Windows密钥被认为是“元”密钥,但浏览器本身不会捕获该密钥。

这仅适用于MacOS /键盘上的命令键。


Shift/ Alt/ 不同CtrlCmd(“ Apple”)键不被认为是修饰键-相反,您应该在keydown/上聆听/ keyup并记录何时按下某个键,然后基于进行按下event.keyCode

不幸的是,这些关键代码取决于浏览器:

  • Firefox: 224
  • 歌剧: 17
  • WebKit浏览器(Safari / Chrome):(91向左命令)或93(向右命令)

您可能对阅读文章JavaScript Madness:键盘事件感兴趣,我从中学到了这些知识。


2
知道Opera现在也属于Webkit类别。我认为只听91、93和224即可完成工作。顺便说一下,17是Ctrl。旧版Opera无法区分Cmd和Ctrl吗?
史蒂文·卢

55
似乎event.metaKey可以在Safari,Firefox和Chrome的当前版本中正常工作。IMO这是一个很明确的解决方案。
米罗斯拉夫·涅季亚尔科夫

5
在回应Miroslav的评论时,请注意,它仅适用于keydown事件,不适用于keyup
nachocab

209

event.metaKey如果您正在处理按键事件,则还可以查看事件的属性。为我做得很棒!您可以在这里尝试


对于MacOS上的Firefox 4.0.1,这似乎不是为我设置的。鉴于接受的答案和链接的参考文献均与您所说的不同,我认为此答案不正确。
乔什·格洛弗

8
.metaKey确实可以在最新的Firefox,Safari和Opera中运行。在Chrome浏览器中,.metaKey在Control(而非Command)上触发。
伊利亚·谢梅诺夫

1
FWIW,cmd + e在您的脚本中对我不起作用。Ctrl会触发您拥有的CMD图标
Oscar Godson 2012年

1
cmd + e也不会为我触发事件(chrome)。Ctrl + E可以。
斯宾塞·威廉姆斯

23
我认为诀窍(即使在Chrome中也是如此)适用于,keydown但不适用于keyupkeypress
philfreo 2012年

15

我发现如果与另一个键一起按下,则可以在最新版本的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


2017年的状况如何?
SuperUberDuper


8

对于使用jQuery的人,有一个出色的插件可以处理关键事件:

GitHub上的jQuery热键

为了捕获+ SCtrl+,S我使用了这个:

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

1
效果很好。所有其他按键也被捕获。
Felix Rabe 2013年

是否支持跨浏览器?
阿迪尔·马利克

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.