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

Ras*_*spy 37 javascript greasemonkey ctrl modifier-key tampermonkey

我试图在按下Ctrl+ Alt+ 时运行脚本e.
Tampermonkey如何同时触发ctrl,alt和e键?

我试过了ctrlKey,而且altKey.我发现没有任何效果.
如何编辑下面的脚本以激活Ctrl+ Alt+ e,而不仅仅是e

(function() {
  document.addEventListener("keypress", function(e) {
    if (e.which == 101) {
      var xhttp = new XMLHttpRequest;
      xhttp.onreadystatechange = function() {
        4 == xhttp.readyState && 200 == xhttp.status && eval(xhttp.responseText)
      }, xhttp.open("GET", "http://127.0.0.1:2337/inject", !0), xhttp.send();
    }
  });
})();
Run Code Online (Sandbox Code Playgroud)

Bro*_*ams 59

有关键盘事件,请参阅W3C规范.提供了几个布尔属性来确定修改键是否与您感兴趣的目标键一起被按下.它们是:

  • ctrlKey     - 还按下了"控制"键.
  • shiftKey   - 还按下了"Shift"键.
  • altKey       - 同时按下"Alt"键.
  • metaKey     - "Meta"键也被按下了.

其他重要说明:

  1. which属性已弃用.
  2. 使用keydown是因为Chrome不会keypress针对已知的键盘快捷方式触发事件.
  3. 某些规范属性(例如)在Firefoxkey仅部分起作用.
  4. 您不需要将代码包装在像Tampermonkey(或Greasemonkey或大多数用户脚本引擎)那样的匿名函数中.自动提供范围保护.

所以,你的代码将成为:

document.addEventListener ("keydown", function (zEvent) {
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.key === "e") {  // case sensitive
        // DO YOUR STUFF HERE
    }
} );
Run Code Online (Sandbox Code Playgroud)

运行这个方便的演示:

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 ()
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这在 OSX 上的 Firefox 中失败,因为按“alt”+“e”会打印出这个字符:`´`。在事件触发器上,`zEvent.key` 属性将是 `´` 而不是 `e`。我通过使用 Ctrl + Shift + e 解决了这个问题,但请记住跨平台! (2认同)

Gid*_*zer 5

keypress一旦按下某个键,就会触发该事件。如果您按下多个键,则每次按下都会触发事件,因此它们被视为独立的按键。

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

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

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