javascript – 在Safari中检测命令按键

我正试图拦截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.

此外,如果我将匹配的字符串从“”更改为“=”并命中command =(有或没有shift键),if语句确实返回true.

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

解决方法:

首先,我不一定建议使用⌘作为快捷方式,因为它已经在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中的键盘快捷键,因此您可以根据需要进行构建.您将需要添加一些事件侦听器来重置模糊事件等上的修改器堆栈.理想情况下,当您释放密钥时,修改器堆栈会自动重置,但由于某些东西可能导致浏览器或观察到的元素/窗口/文档失去焦点,因此无法处理密钥事件,并且已释放的密钥已赢得不要从堆栈中删除.所以检查模糊事件.

上一篇:javascript – ReactJS OnKeyPress触发按钮按下


下一篇:Two Pointers Method Step3 I.Segment with the Required Subset 双指针 + 01布尔背包 + 两个栈维护