繁体   English   中英

"检测组合按键(Control、Alt、Shift)?"

[英]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”键也被按下。

其他重要说明

  1. 不推荐使用which属性
  2. 使用keydown因为Chrome 不会触发已知键盘快捷键的keypress事件。
  3. 一些规范的属性,例如key在 Firefox 中只是部分功能
  4. 您不需要将代码包装在像 Tampermonkey(或 Greasemonkey 或大多数用户脚本引擎)那样的匿名函数中。 范围保护是自动提供的。

因此,您的代码将变为:

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事件在按键被按下后立即触发。 如果您按下多个键,每次按下都会触发事件,因此它们被视为独立的按键。

相反,您可以同时使用keydownkeyup事件来检测多个按键。 您可以拥有一个包含 3 个键和一个布尔状态的对象。 keydown事件中,如果当前键与对象中的键匹配,则将该键的状态设置为true keyup事件中,您将当前键的状态重置为false 如果在最后一次按键时所有 3 个状态都为true ,则触发该事件。

请参阅使用 jQuery 实现此逻辑的示例

更新Brock 的答案对于您将修饰键与单个键代码目标结合使用是一个更好的解决方案,因为ctrlKeyaltKey修饰符是组合检测的,而不是独立处理的。 例如,如果您想同时检测多个键代码,例如EF ,您需要按照上面的方法使用keydownkeyup来跟踪它们。

如果您像我一样来到这里了解如何检测“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 键盘布局上):

速记。 如果您检测到班次,那么您需要将要检查的任何字母大写。 Shift 将通常的小写字母大写。

对比

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM