2016-06-01 31 views
9

Sto cercando di fare una corsa script quando viene premuto Ctrl + Alt +e.
Come può Tampermonkey sparare su un tasto simultaneo ctrl, alt ed e?Rilevamento di combinazioni di tasti premuti (controllo, Alt, Maiusc)?

Ho provato ctrlKey e altKey. Non ho trovato nulla che funzioni.
Come posso modificare lo script di seguito per il fuoco su Ctrl +Alt +e, invece di 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(); 
    } 
    }); 
})(); 

risposta

17

Vedere the W3C spec for keyboard events. Diversi attributi booleani sono forniti per determinare se tasti modificatori sono stati premuti in combinazione con qualsiasi chiave di destinazione che ti interessa Essi sono:.

  • ctrlKey     - Il tasto "Control" è stato anche premuto.
  • shiftKey   - È stato premuto anche il tasto "Shift".
  • altKey       - È stato premuto anche il tasto "Alt".
  • metaKey     - È stato premuto anche il tasto "Meta".

Altro note importanti:

  1. The which property is deprecated.
  2. Usa keydown perché Chrome does not fire the keypress event for known keyboard shortcuts.
  3. Alcune strutture spec, quali key, sono only partly functional in Firefox.
  4. Non è necessario avvolgere il codice in una funzione anonima come quella per Tampermonkey (o Greasemonkey o la maggior parte dei motori userscript). La protezione dell'ambito viene automaticamente fornita.

Quindi, il codice sarebbe diventato:

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

Run questa demo a portata di mano:

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>

+0

Molto perspicace. Sembra una soluzione più semplice per il caso dell'uso di modificatori e di un solo codice tasto di destinazione. Per chiavi multiple, dovresti tenere traccia di ciò che viene selezionato con 'keydown' e' keyup'. –

+0

@Gideon, vero, ma il mio caso d'uso è piuttosto raro nella mia esperienza. –

1

L'evento keypress viene generato non appena viene premuto un tasto. Se si premono più tasti, si attiva l'evento per ogni macchina da stampa, in modo che vengano considerati tasti indipendenti.

Invece, è possibile utilizzare entrambi gli eventi keydown e keyup per rilevare più pressioni dei tasti. Puoi avere un oggetto che contiene le 3 chiavi e uno stato booleano. Nell'evento keydown, se la chiave corrente corrisponde a una chiave nell'oggetto, si imposta lo stato su true per quella chiave. Sull'evento keyup, si ripristina lo stato per la chiave corrente su false. Se tutti e 3 gli stati sono true al momento dell'ultimo tasto premuto, quindi attivare l'evento.

Vedere this example che raggiunge questa logica utilizzando jQuery.

Aggiornamento risposta di Brock è una soluzione migliore per voi utilizzando i tasti di modifica, in combinazione con un singolo bersaglio codice chiave, come vengono rilevate le ctrlKey e altKey modificatori in combinazione, non è gestita in modo indipendente. Se si desidera rilevare più codici chiave come, E e F insieme, per esempio, è necessario tenerne traccia utilizzando keydown e keyup come sopra.

+0

Questo non è un buon approccio per *** tasto modificatore *** come "Control", "Shift", "Alt", ecc. –