在Safari中检测命令+按键组合

4

我正在尝试在Safari中截取command + 键击。我添加了一个事件处理程序如下:

document.onkeypress = handleKeyPress;

function handleKeyPress(event) {
    if ("+" === String.fromCharCode(event.charCode) && event.metaKey) {
        // my code here
        return false;
    }
    return true;
}

当我按下command shift =(在我的美式键盘上,shift =相当于+),if语句不返回true。
如果我去掉if语句中的event.metaKey部分并按下shift =,if语句确实返回true。
此外,如果我将匹配字符串从“+”更改为“=”并按下command =(带或不带shift键),if语句也会返回true。
有没有一种方法可以实际检测到command +键盘按键(而不是假定+键是shift =并检查event.shiftKey,因为这对于某些非美国键盘不正确)?
3个回答

4
首先,我不能保证推荐使用⌘+作为快捷键,因为在Safari中它已经有了一个含义(即缩放页面)。某些人可能仍希望其正常工作。根据您正在构建的内容,这可能是合理的,但除非您确定,请勿覆盖默认快捷键。
无论如何:关键事件往往很棘手,往往是因为keyCode/charCode/which属性并不总是与正确的字母匹配,因此String.fromCharCode并不总是能得到正确的字符串。keyIdentifier有时是一个更好的选择,但并不总是(例如,它对于字母键的代码始终是大写字母)。
过去我做过的事情(我不确定这是否是最好的方法,但它运行良好),是侦听keydown和keyup事件,并“堆叠”修改键。也就是说,每当按下一个键时,检查它是否是修改键(即如果它是cmd、ctrl、alt或shift)。如果是,将其添加到修改器的“堆栈”中。在keyup上执行相反操作;如果释放的键是修改键,则从堆栈中删除它。
现在,在keydown处理程序中,如果键不是修改键,则可以发送keydown事件(与keypress事件不同,keydown事件将具有相当可靠的keyIdentifier属性进行检查),并将修改器的堆栈一起发送到某个其他回调函数,该函数将从那里接管。
在您的情况下,这样的回调将检查cmd键是否在堆栈中,并且keydown事件的keyIdentifier是否为“U+002B”(即+的Unicode代码)。
我已经准备好了一个示例jsfiddle示例。如果您单击“结果”窗格(确保它已获得焦点),然后按⌘+,它应该显示您使用的键组合,并在下面写下“成功!”。否则,它只会显示键组合。在我的键盘上,加号直接可访问,因此我看到的键组合只是“⌘+”。但如果您需要shift来输入加号,您应该看到“⇧⌘+”。
这是一段广义的代码,适用于处理Safari/Mac中的键盘快捷键,因此您可以在其上构建。您需要添加一些事件侦听器来重置模式器堆栈,例如在模糊事件上。理想情况下,模式器堆栈将在释放键时自动重置,但由于某些原因可能导致浏览器或观察元素/窗口/文档失去焦点,keyup事件将无法处理,因此释放的键将不会从堆栈中删除。因此请检查模糊事件。

首先,我完全同意小心使用 ⌘+。我有一个插件,可以覆盖内置的缩放命令,并在每个网站上记住缩放级别,所以在这种情况下我认为使用它是合适的。其次,感谢您的回答。我认为您提供了我需要找到答案的所有工具,但我会花一天的时间来确保我能够将这些信息应用到我的需求中。 - Ceri Morgan
完美运行...谢谢!你的jsfiddle示例有一个小错误,exampleCallback函数中你使用了'='键(U+003D)的unicode而不是'+'键(U+002B)。 - Ceri Morgan
@CeriMorgan:啊,对不起。当我在编写jsfiddle时,我误读了你的问题,认为你想监听⌘=而不是⌘+。我在发布之前编辑了我的答案,但忘记编辑jsfiddle了。无论如何,很棒它代码其他方面都能正常工作。 - Flambino

0

在窗口对象级别上注册事件对象,例如event = window.EE,然后使用Firebug或Safari的Web开发工具浏览它,并查看所触发的值。这样你就会知道要与什么进行比较。


我已经比较了两种情况下的整个事件对象(command shift = 和 command =),结果似乎完全相同,除了前者中存在shiftKey修饰符。然而,我不想假设shift = 总是 +(我已经有一个用户不是这样)。 - Ceri Morgan

0

很遗憾,我认为没有答案。问题是,在按下CMD+SHIFT+=时,按下的charCode为61(=),而不是43(+)。这似乎是一个系统范围的设计,因为Mac OS X本身将CMD+SHIFT+=解释为=加上两个修饰符,而不是+COMMAND

我创建了一个简单的jsFiddle来展示这一点:http://jsfiddle.net/ScuDj/1/

基本上,如果你想检测COMMAND +,你将不得不处理键盘布局。

或者,你可以只支持数字小键盘+ - 这可以保持一致性!(开玩笑;-)

(另外:我尝试连接到textInput事件,但无法在全局注册。我认为它只对domNode起作用。我实际上并没有多少使用过这个事件。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接