Javascript 检测组合按键(控制、Alt、Shift)?

Javascript 检测组合按键(控制、Alt、Shift)?,javascript,greasemonkey,tampermonkey,ctrl,modifier-key,Javascript,Greasemonkey,Tampermonkey,Ctrl,Modifier Key,我试图在按下Ctrl+Alt+e时运行脚本。 Tampermonkey如何同时按ctrl、alt和e键启动 我试过ctrlKey,和altKey。我没有发现任何有效的方法。 如何编辑下面的脚本以在Ctrl+Alt+e而不是仅在e上启动 (函数(){ 文件.添加的文本列表器(“按键”,功能(e){ 如果(e.which==101){ var xhttp=新的XMLHttpRequest; xhttp.onreadystatechange=函数(){ 4==xhttp.readyState&&20

我试图在按下Ctrl+Alt+e时运行脚本。
Tampermonkey如何同时按ctrl、alt和e键启动

我试过
ctrlKey
,和
altKey
。我没有发现任何有效的方法。
如何编辑下面的脚本以在Ctrl+Alt+e而不是仅在e上启动

(函数(){
文件.添加的文本列表器(“按键”,功能(e){
如果(e.which==101){
var xhttp=新的XMLHttpRequest;
xhttp.onreadystatechange=函数(){
4==xhttp.readyState&&200==xhttp.status&&eval(xhttp.responseText)
},xhttp.open(“获取”http://127.0.0.1:2337/inject“,!0),xhttp.send();
}
});

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

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

请参阅如何使用jQuery实现此逻辑

更新 Brock的答案是一个更好的解决方案,您可以将修改键与单个键代码目标结合使用,因为
ctrlKey
altKey
修改器是组合检测的,而不是单独处理的。例如,如果您想同时检测多个键代码,如,
E
F
,则需要使用如上所述的
keydown
keydup
跟踪它们。

请参阅。提供了几个布尔属性来确定修改器键是否与您感兴趣的任何目标键一起按下。它们是:

  • ctrlKey
    ——同时按下“控制”键
  • Shift键
    ——同时按下了“Shift”键
  • altKey
    ——同时按下了“Alt”键
  • metaKey
    ——还按下了“Meta”键
其他重要注意事项:

  • 使用
    keydown
    因为
  • 某些规范属性(如
    )是无效的
  • 您不需要像Tampermonkey(或Greasemonkey或大多数用户脚本引擎)那样将代码封装在匿名函数中。自动提供范围保护
  • 因此,您的代码将变成:

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

    运行此方便的演示(现已更新,
    获得完全支持):

    var targArea=document.getElementById(“keyPrssInp”);
    targetArea.addEventListener('keydown',reportKeyEvent);
    函数reportKeyEvent(zEvent){
    var keyStr=[“控制”、“移位”、“Alt”、“Meta”]。包括(zEvent.key)?“”:zEvent.key+“”;
    风险报告=
    “这个”+
    (zEvent.ctrlKey?“控制”:“+
    (zEvent.shiftKey?“Shift”:“”)+
    (zEvent.altKey?“Alt”:“”)+
    (zEvent.metaKey?“Meta”:“”)+
    按键TR+“键已按下。”
    ;
    $(“#状态报告”).text(reportStr);
    //---按下Ctrl-Alt-E组合键了吗?
    if(zEvent.ctrlKey&&zEvent.altKey&&zEvent.key==“e”){//区分大小写
    this.hitCnt=(this.hitCnt | | 0)+1;
    $(“#状态报告”)。之后(
    “Bingo!cnt:”+this.hitCnt+“

    ” ); } zEvent.stopPropagation(); zEvent.preventDefault() }
    
    按此处的键:
    


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

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

    event.getModifierState('AltGraph')
    

    有关更多详细信息,请参见

    对于修改键(如“Control”、“Shift”、“Alt”)来说,这不是一个好方法。我无法让Firefox识别Alt Gr与字母键的组合,只有与普通Alt的组合。因此,我使用了这种方法,尽管我必须修改并修复它。它有一些不太理想的逻辑。当然,它的核心思想是有效的。但是请注意,如果您的键事件函数是一个包含wait的异步函数,那么keyup事件永远不会触发!所以这个问题需要额外的逻辑。但最终,这一切都很顺利。我找到了真正的解决方案,event.getModifierState('AltGraph'),这就是我从一开始就在寻找的。非常有洞察力。对于使用修饰符和一个目标键代码的情况,看起来是一个更简单的解决方案。对于多个键,您必须跟踪使用
    keydown
    keydup
    选择的内容@Gideon,没错,但这种情况在我的经验中非常罕见。
    zEvent.code
    在Chrome中不存在,在我意识到这一点之前,我一直没有定义,您应该使用
    zEvent.key
    。@CarlosMafla,它仍能正常工作。在Chrome 65.0.3325.181和其他几种浏览器中进行了重新验证。您使用的浏览器版本和操作系统是什么?仅供参考,这在OSX上的Firefox中失败,因为按“alt”+“e”会打印出以下字符:
    '
    。在事件触发时,
    zEvent.key
    属性将是
    '
    ,而不是
    e
    。我通过使用Ctrl+Shift+e解决了这个问题,但要记住跨平台!