在Safari中检测命令+击键

时间:2011-08-31 02:32:01

标签: javascript safari onkeypress

我正试图拦截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,因为某些非美国键盘不会这样)?

3 个答案:

答案 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。我没有真正使用过那个事件。)