Détection de touches de combinaison (contrôle, Alt, Maj)?

je suis en train de faire un script à exécuter lorsque Ctrl+ Alt+ e est enfoncée.

Comment Tampermonkey peut-il tirer sur une clé simultanée ctrl, alt et e?

j'ai essayé ctrlKey et altKey. Je n'ai rien trouvé qui fonctionne.

Comment puis-je éditer le script ci-dessous pour tirer sur Ctrl+ Alt+ e au lieu de e<!--5?

(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();
    }
  });
})();
17
demandé sur Brock Adams 2016-06-01 04:18:53

2 réponses

reportez-vous à le W3C spec pour les événements de clavier. Plusieurs attributs booléens sont fournis pour déterminer si touches de modification ont été pressés en conjonction avec la touche cible qui vous intéresse. Ils sont les suivants:

  • ctrlKey -- la touche" Contrôle " a aussi été pressée.
  • shiftKey -- la touche" Shift " a aussi été pressée.
  • altKey -- la touche" Alt " a aussi été pressée.
  • metaKey -- Le La touche" Meta " a aussi été pressée.

Autres notes importantes:

  1. which la propriété est dépréciée.
  2. Utiliser keydown parce que Chrome ne tire pas le keypress événement pour les raccourcis clavier connus.
  3. Quelques caractéristiques techniques de propriétés, telles que key qui sont seulement partiellement fonctionnel dans Firefox.
  4. vous n'avez pas besoin d'emballer votre code une fonction anonyme comme celle pour Tampermonkey (ou Greasemonkey ou la plupart des moteurs userscript). La protection de la portée est automatiquement assurée.

ainsi, votre code deviendrait:

document.addEventListener ("keydown", function (zEvent) {
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.code === "KeyE") {
        // DO YOUR STUFF HERE
    }
} );

Exécuter cette pratique démo:

var targArea = document.getElementById ("keyPrssInp");
targArea.addEventListener ('keydown',  reportKeyEvent);

function reportKeyEvent (zEvent) {
    var reportStr   =
        "The " +
        ( zEvent.ctrlKey  ? "Control " : "" ) +
        ( zEvent.shiftKey ? "Shift "   : "" ) +
        ( zEvent.altKey   ? "Alt "     : "" ) +
        ( zEvent.metaKey  ? "Meta "    : "" ) +
        zEvent.code + " " +
        "key was pressed."
    ;
    $("#statusReport").text (reportStr);

    //--- Was a Ctrl-Alt-E combo pressed?
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.code === "KeyE") {
        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>
29
répondu Brock Adams 2016-06-01 05:01:16

keypress événement est déclenché dès qu'une touche a été pressée. Si vous appuyez sur plusieurs touches, cela déclenche l'événement pour chaque presse, de sorte qu'elles sont considérées comme des presses à clés indépendantes.

a la place, vous pouvez utiliser les deux keydown et keyup événements pour détecter de multiples pressions sur les touches. Vous pouvez avoir un objet qui contient les 3 clés et un boolean etat. Sur le keydown événement, si la clé correspond à une clé dans l'objet, vous pouvez définir l'état d' true pour cette clé. Sur le keyup event, vous réinitialisez l'état de la touchefalse. Si les 3 états sont true à l'heure de la dernière touche, puis déclenche l'événement.

Voir cet exemple qui réalise cette logique en utilisant jQuery.

mise à Jour La réponse de Brock est une meilleure solution pour vous en utilisant des touches modificatrices en combinaison avec une seule cible de code clé, comme le ctrlKey et altKey les modificateurs sont détectés en combinaison et ne sont pas manipulés indépendamment. Si vous voulez détecter plusieurs codes clés comme,E et F ensemble, par exemple, vous devez garder une trace d'eux en utilisant keydown et keyup comme indiqué ci-dessus.

0
répondu Gideon Pyzer 2016-06-01 12:06:50