4

我正在尝试拦截 Safari 中的命令 + 击键。我添加了一个事件处理程序,如下所示:

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 部分并 hit shift =,则 if 语句确实返回 true。

此外,如果我将匹配字符串从“+”更改为“=”并点击command =(使用或不使用 shift 键),if 语句确实返回 true。

有没有办法实际检测命令 + 按键(不假设 + 键是 shift = 并检查 event.shiftKey,因为对于某些非美国键盘来说这不是真的)?

4

3 回答 3

4

首先,我不一定推荐使用 ⌘+ 作为快捷方式,因为它在 Safari 中已经意味着某些东西(即缩放页面)。有人可能希望它仍然正常工作。根据您正在构建的内容,这可能是有意义的,但除非您确定,否则不要覆盖默认快捷方式。

无论如何:关键事件是棘手的,通常是因为 keyCode/charCode/which 属性并不总是与正确的字母匹配,所以String.fromCharCode不会总是给你一个正确的字符串。keyIdentifier有时是更好看的东西,但并非总是如此(例如,它的字母键代码总是大写字母)。

我过去所做的(我不确定这是不是最好的方法,但它工作正常)是改为监听 keydown 和 keyup 事件,以及“堆栈”修饰键。即每当一个键被按下时,检查它是否是一个修饰键(即它是否是cmd、ctrl、alt 或shift)。如果是,请将其添加到修饰符的“堆栈”中。在 keyup 上做相反的事情;如果释放的键是修饰符,则将其从堆栈中删除。

现在,回到 keydown 处理程序,如果键不是修饰键,您可以发送 keydown 事件(与 keypress 事件不同,它有一个非常可靠的keyIdentifier属性要检查),以及修饰符堆栈其他一些回调,从那里开始。

在您的情况下,这样的回调将检查 cmd-key 是否在堆栈中,并且 keydown 事件的 keyIdentifier 是“U+002B”(这是 unicode 代码+)。

我已经整理了一个 jsfiddle 示例来说明我正在谈论的内容。如果您单击“结果”窗格(以确保它获得焦点),然后按 ⌘+,它应该会显示您使用的组合键,并写下“成功!” 以下。否则,它只会显示组合键。在我的键盘上,加号是可以直接访问的,所以我看到的组合键就是“⌘+”。但是如果你需要 shift 来输入一个加号,你应该会看到“⇧⌘+”。

这是一段通用的代码,可以很好地处理 Safari/Mac 中的键盘快捷键,因此您可以根据需要在其上进行构建。您需要添加一些事件侦听器来重置模糊事件等的修改器堆栈。理想情况下,当您释放键时,修改器堆栈会自动重置,但由于某些事情可能会导致浏览器或观察到的元素/窗口/文档失去焦点,keyup 事件将不会被处理,并且释放的键将赢'不会从堆栈中删除。所以检查模糊事件。

于 2011-08-31T04:57:16.820 回答
0

在一级窗口对象中注册事件对象,例如 event = window.EE,然后使用 Firebug 或 Safari 的 Web 开发工具浏览它,并查看在需要时触发的值。所以你会知道要比较什么。

于 2011-08-31T03:40:27.953 回答
0

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

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

基本上,如果您想检测COMMAND +.

或者,您只能支持数字键盘+- 始终如一地工作!(只是在开玩笑 ;-)

(另外:我尝试附加到该textInput事件,但无法让它在全球范围内注册。我认为它仅适用于 domNodes。我并没有真正使用该事件。)

于 2011-08-31T03:43:10.763 回答