Cattura la combinazione di tasti ctrl + z in javascript


86

Sto cercando di acquisire la combinazione di tasti ctrl+ zin javascript con questo codice:

<html>
<head>
    <title>Untitled Document</title>
</head>
<body>

    <script type='text/javascript'>
        function KeyPress(e) {
            var evtobj = window.event? event : e


            //test1 if (evtobj.ctrlKey) alert("Ctrl");
            //test2 if (evtobj.keyCode == 122) alert("z");
            //test 1 & 2
            if (evtobj.keyCode == 122 && evtobj.ctrlKey) alert("Ctrl+z");
        }

        document.onkeypress = KeyPress;
    </script>

</body>
</html>

La riga commentata "test1" genera l'avviso se tengo premuto il ctrltasto e premo qualsiasi altro tasto.

La riga commentata "test2" genera l'avviso se premo il ztasto.

Mettili insieme come nella riga dopo "test 1 & 2" e tenendo premuto il ctrltasto e poi premendo il ztasto non si genera l'avviso come previsto.

Cosa c'è di sbagliato nel codice?

Risposte:


95
  1. Usa onkeydown(o onkeyup), noonkeypress
  2. Usa keyCode90, non 122

Demo online: http://jsfiddle.net/29sVC/

Per chiarire, i codici chiave non sono gli stessi dei codici dei caratteri.

I codici dei caratteri sono per il testo (differiscono a seconda della codifica, ma in molti casi 0-127 rimangono codici ASCII). I codici dei tasti vengono mappati ai tasti di una tastiera. Ad esempio, nel carattere Unicode 0x22909 significa 好. Non ci sono molte tastiere (se ce ne sono) che hanno effettivamente una chiave per questo.

Il sistema operativo si occupa di trasformare le sequenze di tasti in codici di caratteri utilizzando i metodi di input configurati dall'utente. I risultati vengono inviati all'evento keypress. (Mentre keydown e keyup rispondono all'utente che preme i pulsanti, non digitando testo.)


1
Grazie, funziona. Perché onkeypress e keyCode 122 non funzionano?
Paul Johnston

Come prevenireDefault () invece di alert nella tua soluzione, per favore? Sto provando per Ctrl + t.
Surendra Jnawali

@SJnawali: Non sono sicuro che sia possibile perctrl+t
zerkms

4
perché keyCode 122 non funziona? beh, 122è per il tasto F11 :)
Baby

7
@PaulJohnston Perché un codice chiave non è lo stesso di un codice carattere . I codici dei caratteri sono per il testo (differiscono a seconda della codifica, ma in molti casi 0-127 rimangono codici ASCII). I codici dei tasti vengono mappati ai tasti di una tastiera. Ad esempio, nel carattere Unicode 0x22909 significa 好. Non ci sono molte tastiere (se ce ne sono) che hanno effettivamente una chiave per questo. Il sistema operativo si occupa di trasformare le sequenze di tasti in codici di caratteri utilizzando i metodi di input configurati dall'utente. I risultati vengono inviati keypressall'evento. (Considerando che keydowne keyuprispondi all'utente premendo i pulsanti, non digitando testo.)
Aidiakapi

32

Per le persone future che si imbattono in questa domanda, ecco un metodo migliore per portare a termine il lavoro:

document.addEventListener('keydown', function(event) {
  if (event.ctrlKey && event.key === 'z') {
    alert('Undo!');
  }
});

L'uso event.keysemplifica notevolmente il codice, rimuovendo le costanti hardcoded. Supporta IE 9+.

Inoltre, l'utilizzo document.addEventListenersignifica che non si bloccheranno altri ascoltatori allo stesso evento.

Infine, non c'è motivo di usare window.event. È attivamente scoraggiato e può causare un codice fragile.


Inoltre, aggiungerei che KeyboardEvent.keyCodeora è deprecato da un paio di anni fa. Il modo migliore per acquisire tutti i browser è e.keyprima il controllo e poi il fallback e.keyCode. Oppure puoi usare questo polyfill
Sì Barry

9

Ctrl+ tè anche possibile ... basta usare il codice come 84 like

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");

6
$(document).keydown(function(e){
  if( e.which === 89 && e.ctrlKey ){
     alert('control + y'); 
  }
  else if( e.which === 90 && e.ctrlKey ){
     alert('control + z'); 
  }          
});

Demo


3

90 è la Zchiave e questo farà la cattura necessaria ...

function KeyPress(e){
     // Ensure event is not null
     e = e || window.event;

     if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {
         // Ctrl + Z
         // Do Something
     }
}

A seconda delle tue esigenze, potresti voler aggiungere una e.preventDefault();dichiarazione if per eseguire esclusivamente la tua funzionalità personalizzata.


0
document.onkeydown = function (e) {
    var special = e.ctrlKey || e.shiftKey;
    var key = e.charCode || e.keyCode;
  console.log(key.length);
  if (special && key == 38 || special && key == 40 ) { 
    // enter key do nothing
    e.preventDefault();
  }        
}

ecco un modo per bloccare due tasti, combinazioni di tasti Shift + o Ctrl +.

&& aiuta con le combinazioni di tasti, senza le combinazioni, blocca tutti i tasti ctrl o maiusc.


-3

Questo plugin realizzato da me potrebbe essere utile.

Collegare

Puoi usare questo plugin devi fornire i codici chiave e la funzione per essere eseguito in questo modo

simulatorControl([17,90], function(){console.log('You have pressed Ctrl+Z');});

Nel codice ho mostrato come eseguire per Ctrl+ Z. Otterrai una documentazione dettagliata sul link. Il plugin è nella sezione Codice JavaScript della mia penna su Codepen.


-5

Usa questo codice per CTRL+ Z. keycode per Zin keypress è 122 e il CTRL+ Zè 26. controlla questo keycode nell'area della tua console

 $(document).on("keypress", function(e) {
       console.log(e.keyCode);
       /*ctrl+z*/
       if(e.keyCode==26)
       {
          //your code here
       }
    });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.