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();
}
});
})();
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:
which
la propriété est dépréciée.- Utiliser
keydown
parce que Chrome ne tire pas lekeypress
événement pour les raccourcis clavier connus. - Quelques caractéristiques techniques de propriétés, telles que
key
qui sont seulement partiellement fonctionnel dans Firefox. - 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>
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.