我正试图拦截Safari中的命令+击键。我添加了一个事件处理程序,如下所示:
document.onkeypress = handleKeyPress;
function handleKeyPress(event) {
if ("+" === String.fromCharCode(event.charCode) && event.metaKey) {
// my code here
return false;
}
return true;
}
当我点击命令 shift = ( shift = 是{{在我的美国键盘上),if语句不会返回true。
如果我删除if语句的event.metaKey部分并按 shift = ,则if语句确实返回true。
另外,如果我将匹配的字符串从“+”更改为“=”并点击命令 = (带或不带shift键),if语句执行返回true。
有没有办法实际检测命令+按键(不假设+键是shift =并检查event.shiftKey,因为某些非美国键盘不会这样)?
答案 0 :(得分:4)
首先,我不一定建议使用⌘+作为快捷方式,因为它在Safari中已经意味着什么(即缩放页面)。有人可能希望它仍能正常工作。根据您正在构建的内容,它可能有意义,但除非您确定,否则不要覆盖默认快捷方式。
无论如何:Key events are tricky,通常因为keyCode / charCode /哪些属性并不总是与正确的字母匹配,所以String.fromCharCode
并不总能为您提供正确的字符串。 keyIdentifier
有时候看起来更好,但并非总是如此(例如,其字母键的代码总是大写字母)。
我过去所做的(我不确定这是最好的方法,但它确实可行),而是监听keydown和keyup事件,以及“堆栈”修改键。即每当按下一个键时,检查它是否是一个修饰键(即它是否为cmd,ctrl,alt或shift)。如果是,则将其添加到修改器的“堆栈”中。在密钥上做相反的事情;如果释放的键是修饰符,则将其从堆栈中删除。
现在,回到keydown-handler中,如果键不是修饰键,则可以发送keydown事件(与keypress事件不同,它将具有非常可靠的keyIdentifier
属性来检查) ,以及一些修饰符和其他一些回调,它们将从那里获取。
在您的情况下,这样的回调将检查cmd-key是否在堆栈中,并且keydown事件的keyIdentifier是“U + 002B”(这是+
的unicode代码)。
I've put together a jsfiddle example我正在谈论的内容。如果单击“结果”窗格(以确保它具有焦点),然后按⌘+,它应显示您使用的组合键,并写入“成功!”下面。否则,它只会显示关键组合。在我的键盘上,可以直接访问加号,因此我看到的关键组合只是“⌘+”。但是,如果您需要转换以输入加号,则应看到“⇧⌘+”。
这是一段广泛的代码,非常适合处理Safari / Mac中的键盘快捷键,因此您可以根据需要进行构建。您将需要添加一些事件侦听器来重置模糊事件等上的修改器堆栈。理想情况下,当您释放密钥时,修改器堆栈会自动重置,但由于某些东西可能导致浏览器或观察到的元素/窗口/文档失去焦点,因此无法处理密钥事件,并且已释放的密钥已赢得不要从堆栈中删除。所以检查模糊事件。
答案 1 :(得分:0)
在窗口对象一级,例如event = window.EE中注册事件对象,然后使用Firebug或Safari的Web开发人员工具浏览它,并查看所需的值。所以你会知道要比较什么。
答案 2 :(得分:0)
CMD+SHIFT+=
,被按下的charCode
是61(=
),而不是43(+
)。这似乎是一个系统范围的设计,因为Mac OS X本身将CMD+SHIFT+=
解释为=
加上两个修饰符,而不是+
和COMMAND
。
我整理了一个简单的jsFiddle以显示:http://jsfiddle.net/ScuDj/1/
基本上,如果要检测COMMAND +
,则必须处理键盘布局。
或者,您只能支持数字小键盘+
- 一直有效! (开玩笑; - )
(另外:我试图附加到textInput
事件,但无法让它在全局注册。我认为它只适用于domNodes。我没有真正使用过那个事件。)