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

如何捕获Mac';通过JavaScript的s命令键?,javascript,dom-events,Javascript,Dom Events,如何通过JavaScript捕获Mac的Cmd密钥?编辑:自2019年起,e.metaKey是 var element = //the DOM element to listen for the key on. element.onkeyup = function(e) { if(e.metaKey) { //command key was pressed } } 请注意,在Windows上,虽然⊞ Windows键被认为是“meta”键,它不会被浏览器捕获 这仅适用于

如何通过JavaScript捕获Mac的Cmd密钥?

编辑:自2019年起,
e.metaKey

var element = //the DOM element to listen for the key on.
element.onkeyup = function(e) {
   if(e.metaKey) {
      //command key was pressed
   }
}
请注意,在Windows上,虽然⊞ Windows键被认为是“meta”键,它不会被浏览器捕获

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


与Shift/Alt/Ctrl不同,Cmd(“苹果”)键不被视为修改键,相反,您应该收听
keydown
/
keydup
,并根据
event.keyCode
记录何时按下某个键,然后按下该键

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

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

您可能对阅读这篇文章感兴趣,我从中了解到了这些知识。

如果您正在使用keydown事件,您还可以查看事件的
event.metaKey
属性。为我工作得很好

对于使用jQuery的用户,有一个处理关键事件的优秀插件:

捕捉⌘+S和Ctrl+S我使用的是:

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

我发现,在最新版本的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基于Ilya的数据,我编写了一个支持Mac上修改键的Vanilla JS库:

就这样使用它,例如:

document.onclick = function (event) {
  if (event.shiftKey || macKeys.shiftKey) {
    //do something interesting
  }
}

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

以下是我在AngularJS中的操作方法

app=angular.module('MM_图形')
类键盘
构造函数:($injector)->
@.$injector=$injector
@.$window=@.$injector.get(“$window”)#获取对$window和$rootScope对象的引用
@.$rootScope=@.$injector.get(“$rootScope”)
按下按键时:($event)=>
@.$rootScope.$broadcast'keydown',$event#广播全局keydown事件
如果$event.code为“KeyS”且($event.ctrlKey或$event.metaKey)#检测S键被按下且OSX命令或窗口控制键被按下
@.$rootScope.$broadcast“”,$event#broadcast keyup\u CtrS事件
#$event.preventDefault()#事件侦听器应使用此选项来防止默认浏览器行为
设置挂钩:()=>
angular.element(@.$window).bind“keydown”,@.on_Key_Down#钩住窗口中的keydown事件(每次加载应用程序时仅调用一次)
@
app.service“键盘”,($injector)=>
返回新键盘($injector).setup_Hooks()

如果您使用Vuejs,只需使用vue快捷键插件即可,一切都会很简单



不工作:(@datagrade,请显示您的代码。元键是否与Mac
命令相同?
?var element=document.body;element.onKeyUp=function(e){if(e.metaKey){console.log('cmd pressed')}MacOS上的Firefox 4.0.1似乎没有为我设置这一点。考虑到接受的答案和链接的引用都与您所说的不一致,我认为这个答案是不正确的。
。metaKey
确实适用于最新的Firefox、Safari和Opera。在Chrome中,
。metaKey
会触发控件(而不是命令).FWIW,cmd+e在您的脚本中对我不起作用。Ctrl触发您拥有的cmd图标cmd+e也不会为我触发事件(chrome)。Ctrl+e也会。我认为诀窍(即使在chrome中)是,它适用于
keydown
,但不适用于
keyup
keypress
。使用它有一个javascript库:(没有像jquery这样的依赖项)效果太好了。所有其他按键也被捕获。它支持跨浏览器吗?如果你访问了我答案中的链接,你就会知道:知道Opera现在也属于Webkit类别。我想只要听91、93和224就可以完成任务。顺便说一句,17是Ctrl。老Opera没有区分Cmd和Ctrl吗?看起来是这样的event.metaKey在当前版本的Safari、Firefox和Chrome中非常有效。在我看来,这是一个非常明确的解决方案。作为对Miroslav评论的回应,只需注意它只对
keydown
事件有效,而不是
keydup
。作为对@nachocab评论的回应:e.key==='Meta'对keydown和keydup都有效。因此这一点可以用在e.Metakey2017年的情况如何?
v-shortkey="['meta', 'enter']"·
@shortkey="metaEnterTrigged"