[英]Combination of Keypresses using JS / Jquery ( Escape & Shift +Escape )
[英]Detecting combination keypresses (Control, Alt, Shift)?
我试图在按下 Ctrl<\/kbd> + Alt<\/kbd> + e<\/kbd>时运行脚本。
Tampermonkey 如何同时使用 ctrl、alt 和 e 键触发?
我试过
ctrlKey<\/code>和
altKey<\/code> 。
我没有发现任何有用的东西。
如何编辑下面的脚本以在Ctrl<\/kbd> + Alt<\/kbd> + e<\/kbd>上触发,而不仅仅是e<\/kbd> ?
有关键盘事件,请参阅 W3C 规范。 提供了几个布尔属性来确定修改键是否与您感兴趣的任何目标键一起按下。它们是:
ctrlKey
“控制”键也被按下。shiftKey
-- "Shift" 键也被按下。altKey
——“Alt”键也被按下。metaKey
——“Meta”键也被按下。其他重要说明:
which
属性。keydown
因为Chrome 不会触发已知键盘快捷键的keypress
事件。key
,在 Firefox 中只是部分功能。因此,您的代码将变为:
document.addEventListener ("keydown", function (zEvent) {
if (zEvent.ctrlKey && zEvent.altKey && zEvent.key === "e") { // case sensitive
// DO YOUR STUFF HERE
}
} );
运行这个方便的演示(现在更新, key
是完全支持) :
var targArea = document.getElementById ("keyPrssInp"); targArea.addEventListener ('keydown', reportKeyEvent); function reportKeyEvent (zEvent) { var keyStr = ["Control", "Shift", "Alt", "Meta"].includes(zEvent.key) ? "" : zEvent.key + " "; var reportStr = "The " + ( zEvent.ctrlKey ? "Control " : "" ) + ( zEvent.shiftKey ? "Shift " : "" ) + ( zEvent.altKey ? "Alt " : "" ) + ( zEvent.metaKey ? "Meta " : "" ) + keyStr + "key was pressed." ; $("#statusReport").text (reportStr); //--- Was a Ctrl-Alt-E combo pressed? if (zEvent.ctrlKey && zEvent.altKey && zEvent.key === "e") { // case sensitive this.hitCnt = ( this.hitCnt || 0 ) + 1; $("#statusReport").after ( '<p>Bingo! cnt: ' + this.hitCnt + '</p>' ); } zEvent.stopPropagation (); zEvent.preventDefault () }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> <p><label>Press keys in here:<input type="text" value="" id="keyPrssInp"></label> </p> <p id="statusReport"></p>
keypress
事件在按键被按下后立即触发。 如果您按下多个键,每次按下都会触发事件,因此它们被视为独立的按键。
相反,您可以同时使用keydown
和keyup
事件来检测多个按键。 您可以拥有一个包含 3 个键和一个布尔状态的对象。 在keydown
事件中,如果当前键与对象中的键匹配,则将该键的状态设置为true
。 在keyup
事件中,您将当前键的状态重置为false
。 如果在最后一次按键时所有 3 个状态都为true
,则触发该事件。
请参阅使用 jQuery 实现此逻辑的示例。
更新Brock 的答案对于您将修饰键与单个键代码目标结合使用是一个更好的解决方案,因为ctrlKey
和altKey
修饰符是组合检测的,而不是独立处理的。 例如,如果您想同时检测多个键代码,例如E
和F
,您需要按照上面的方法使用keydown
和keyup
来跟踪它们。
如果您像我一样来到这里了解如何检测“Alt Gr”键与字母键的组合,那么例如 event.altKey 之类的属性不能用于此,因为没有 event.AltGrKey财产。
在这种情况下,您可以使用
event.getModifierState('AltGraph')
有关更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState
我正在使用hotkeys-js<\/a>来抽象功能,但仍然必须让用户选择自己的自定义快捷方式(事先不知道)。 然后我尝试了@Brock Adams 的答案,以获得输入框中按下的快捷键的等效格式的 hotkeys-js。
我在实验时发现的东西(在 Chrome 92 上的意大利 QWERTY 键盘布局上):
所以Ctrl+Alt+E<\/code> (如在 OP 问题中)给出€<\/code> 。
Ctr+Alt+5<\/code>也是如此。
其他组合也有同样的问题,比如Ctrl+Alt+ò<\/code>在意大利语键盘上给出@<\/code>
<\/li>
每个 Shifted 字符都在e.key<\/code>中找到,因为它是移位对应物,保留修饰符属性,因此Shift+5<\/code>打印为Shift+%<\/code>这是有问题的(考虑到 AltGr 行为)。
<\/li>
我在我的键盘上找到了Ctrl+Shift+9<\/code> 、 Ctrl+Shift+0<\/code> 、 Ctrl+Shift+L<\/code>和Ctrl+Shift+Alt+D<\/code>作为示例。
这可能是薄膜键盘的限制。<\/li><\/ul> 第二点对我来说很关键,因为我们的客户习惯于 Ctrl+Shift+[Number] 组合。
我通过处理 keyCode 介于 48 和 58 之间的特殊情况并手动转换为相应的数字来解决它。 虽然它仍然没有解决任何其他用 Shift 修改的特殊字符,但是鉴于它们非常依赖于键盘布局,我看不到任何通用的解决方案。 尽管如此,我从来不知道有人想要一个带有特殊字符的快捷方式。
如果不要求可读性和\/或您事先知道要检查的组合键,则使用
event.keyCode<\/a>而不是
event.key<\/code>可能更安全。
速记。 如果您检测到班次,那么您需要将要检查的任何字母大写。 Shift 将通常的小写字母大写。
对比
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.