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

Posted

技术标签:

【中文标题】如何通过 JavaScript 捕获 Mac 的命令键?【英文标题】:How does one capture a Mac's command key via JavaScript? 【发布时间】:2011-04-23 14:10:46 【问题描述】:

如何通过 javascript 捕获 Mac 的 Cmd 键?

【问题讨论】:

使用这个github.com/madrobby/keymaster 有一个 javascript-lib :keymaster.js(没有像 jquery 这样的依赖项) 【参考方案1】:

keyCodewhich 现在是 deprecated,因此建议避免使用此处的答案。

现在执行此操作的一种方法是在 DOM keyupkeypress 事件附带的事件参数上使用 key 属性。下面是一个简单的例子:

document.onkeypress = (event) => 
    if (event.key === 'Meta') 
        console.log("Mac or Windows key was pressed!");
     else 
        console.log("Another key was pressed")
    

这将在 Mac (See Meta on the MDN docs) 上按下 cmd 键时触发。这里唯一需要注意的是它也会在 Windows 按键上触发,用户键盘/操作系统也支持它。

如果您需要更详细地了解按下了哪个元键,您可以在事件上使用 code 属性,该属性可以是 MetaLeft or MetaRight,具体取决于哪个物理元键 (cmd)被按下了。

【讨论】:

【参考方案2】:

如果您正在处理keydown 事件,您还可以查看该事件的event.metaKey 属性。为我工作得非常好! You can try it here.

【讨论】:

MacOS 上的 Firefox 4.0.1 似乎没有为我设置。鉴于接受的答案和链接的参考都与您所说的不一致,我认为这个答案是不正确的。 .metaKey 确实适用于最新的 Firefox、Safari 和 Opera。在 Chrome 中,.metaKey 在 Control(而非 Command)上触发。 FWIW,cmd+e 在您的脚本中对我不起作用。 Ctrl 触发你拥有的 CMD 图标 cmd+e 也不会为我触发事件(chrome)。 ctrl+e 可以。 我认为诀窍(即使在 Chrome 中)是这适用于keydown,但不适用于keyupkeypress【参考方案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()

【讨论】:

【参考方案4】:

编辑:截至 2019 年,e.metaKey 为 supported on all major browsers as per the MDN。

请注意,在 Windows 上,虽然 ⊞ Windows 键被认为是“元”键,但它不会被浏览器捕获。

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


Shift/Alt/Ctrl 不同,Cmd(“Apple”)键不被视为修饰键 — 相反,您应该在 keydown/keyup 上收听,并根据 event.keyCode 记录按下和按下键的时间。

很遗憾,这些关键代码取决于浏览器:

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

您可能有兴趣阅读文章JavaScript Madness: Keyboard Events,我从中学到了这些知识。

【讨论】:

知道 Opera 现在也属于 Webkit 类别。我认为只听 91、93 和 224 就可以完成工作。顺便说一句,17 是 Ctrl。老 Opera 没有区分 Cmd 和 Ctrl 吗?? 似乎 event.metaKey 在当前版本的 Safari、Firefox 和 Chrome 中像一个魅力一样工作。 IMO 这是非常明确的解决方案。 针对 Miroslav 的评论,请注意它仅适用于 keydown 事件,不适用于 keyup 回应@nachocab 的评论:e.key === 'Meta' 适用于 keydown 和 keyup。所以可以用这个代替e.metaKey【参考方案5】:

如果你使用Vuejs,只需通过vue-shortkey插件制作,一切都会变得简单

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

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

【讨论】:

【参考方案6】:

根据 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
  

在 Mac 上的 Chrome、Safari、Firefox、Opera 上测试。请检查它是否适合您。

【讨论】:

【参考方案7】:

我发现你可以在最新版本的 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年情况如何?【参考方案8】:

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

jQuery hotkeys on GitHub

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

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

【讨论】:

效果太好了。所有其他按键也会被捕获。 是否支持跨浏览器? 如果您访问了我回答中的链接,您就会知道:github.com/tzuryby/jquery.hotkeys#jquery-compatibility【参考方案9】:
var element = //the DOM element to listen for the key on.
element.onkeyup = function(e) 
   if(e.metaKey) 
      //command key was pressed
   

【讨论】:

var element = document.body; element.onKeyUp = function(e) if(e.metaKey) console.log('cmd press')

以上是关于如何通过 JavaScript 捕获 Mac 的命令键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mac中使用Visual Studio中的异常捕获日志?

Google终于开始革C++的命了!

如何在 javascript 中捕获 .NET 异常?

在 Javascript 中捕获同源异常?

如何获得Mac Dock截图

如何在Google跟踪代码管理器中设置javascript,以便从订单中的多个产品中捕获订单详细信息