58

我试图在按下Ctrl++Alt时运行脚本。 Tampermonkey 如何同时使用 ctrl、alt 和 e 键触发?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();
    }
  });
})();

4

5 回答 5

99

有关键盘事件,请参阅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>

于 2016-06-01T05:01:16.360 回答
6

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

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

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

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

于 2016-06-01T02:18:54.357 回答
1

如果您像我一样来到这里了解如何检测“Alt Gr”键与字母键的组合,那么例如 event.altKey 之类的属性不能用于此,因为没有 event.AltGrKey财产。

在这种情况下,您可以使用

event.getModifierState('AltGraph')

有关更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState

于 2020-09-28T07:31:11.780 回答
1
于 2021-08-18T15:29:22.733 回答
0

Quick note. If you're detecting shift, then you need to capitalize whatever letter you're checking. Shift capitalizes the normally lowercase letter.

if (zEvent.shiftKey && zEvent.key === "T")

vs

if (zEvent.ctrlKey && zEvent.key === "t")

if (zEvent.altKey && zEvent.key === "t")

于 2021-12-25T05:42:12.493 回答