2012-02-01 13 views
12

Quando l'utente tiene premuto un tasto, voglio che l'evento keydown() venga chiamato una sola volta, ma viene richiamato finché l'utente non smette di premere il tasto.Come disattivare il keydown ripetitivo in jQuery

Ecco quello che sto cercando di fare:

$(document).keydown(function(event){ 
    var keycode = (event.keyCode ? event.keyCode : event.which); 
    if(keycode == '39'){ 
       $("#box").animate({"left": "+=30px"}, "fast"); 
    } 
    }); 

Così, quando l'utente preme il tasto freccia destra, voglio che il # scatola div per spostare 30px a destra. Si muove ma se l'utente tiene premuto il tasto, vola via.

Ho bisogno di spostarlo solo di 30px a pressione e di fermarsi, anche se l'utente mantiene premuto il tasto. Sai come può essere realizzato?

+2

Per comodità, 'event.keyCode? event.keyCode: event.which' è equivalente a 'event.keyCode || event.which', anche per i non-booleani. – Keen

risposta

17

Tenere traccia di quali chiavi sono in calo, e ignorare keycode 39 fino a quando un keyup ancora libera:

var down = {}; 

$(document).keydown(function(event){ 
    var keycode = (event.keyCode ? event.keyCode : event.which); 
    if(keycode == '39'){ 
      if (down['39'] == null) { // first press 
       $("#box").animate({"left": "+=30px"}, "fast"); 
       down['39'] = true; // record that the key's down 
      } 
    } 
    }); 

$(document).keyup(function(event) { 
    var keycode = (event.keyCode ? event.keyCode : event.which); 
    down[keycode] = null; 
}); 
+0

Grazie per il tuo approccio! Ha funzionato. Segnalo come risposta corretta. – Nazar

+1

Credo che tu abbia un errore di sintassi? $ (documento) .keyup (funzione (evento) { var keycode = (event.keyCode? Event.keyCode: event.which); down [keycode] = null; }); – Nazar

2

tenere una bandiera e trasformarlo verde su keydown Vorrei suggerire keyup se

$(document).keydown(function(event){ 
    $flag=false; 
    var keycode = (event.keyCode ? event.keyCode : event.which); 

     if(keycode == '39'){ 
      if(!$flag){ 
       $flag=true; 
       $("#box").animate({"left": "+=30px"}, "fast"); 
     } 
    } 
    }); 
Problemi correlati