2012-06-13 6 views
8

Ciao Ho impostato un testo di input automatico. Sto tentando di avviare l'evento di ristampa della tabella al clic di un btn e su un tasto Invio. il btn click funziona bene e ma la pressione di un tasto enter sembra che spara un paio di volte prima di stoping (cioè il tavolo sfarfalla)jQuery keypress evento che spara alcune volte

$('body').bind('keypress', function(e) { 
     if(e.keyCode==13){ 
      var str = $('#Filter').val(); 
      $('#Table').fadeOut("slow").load('printShorts.server.php?Sortby=<?echo $sort;?>&dir=<?echo $direction;?>&filter='+encodeURIComponent(str)+'&usergroup=<?=$usergroup?>&no-cache=' + (new Date()).getTime()).fadeIn("slow"); 
     } 

}); 

non accade tutto il tempo e agisce differntly nei browser differnt ..

risposta

12

KeyDown in combinazione con un testo html non sarà sufficiente ad impedire che venga sparato più volte. Puoi vedere questo comportamento in azione nella sezione demo jquery dell'evento keydown: http://api.jquery.com/keydown/

Una possibile soluzione è utilizzare l'eventhandler "uno" (vedere http://api.jquery.com/one/). Che assicura l'evento viene gestito solo una volta:

jQuery("#createNewProduct").one("keydown", function (e) { 
    //Do Stuff 
}); 
+8

grazie, bello (capito?:-)) – devmonster

+1

vedo quello che hai fatto lì – Dishcandanty

+0

Ahhhh ... Aces! Questo mi stava facendo impazzire! – JustBaron

4

http://api.jquery.com/keypress/

keyPress viene inviato ad un elemento quando il browser registra input da tastiera. È simile all'evento keydown, ad eccezione di nel caso di ripetizioni di tasti. Se l'utente preme e tiene premuto un tasto, viene attivato un evento keydown una volta, ma gli eventi di pressione tasti separati sono attivati ​​per ciascun carattere inserito. Inoltre, i tasti modificatori (come Shift) attivano gli eventi keydown ma non gli eventi di keypress.

Utilizzare invece keydown.

7

Questo è il comportamento corretto dell'evento di pressione del tasto. L'evento di pressione continua a sparare finché il tasto non è premuto (come se si tenesse premuto un tasto char quando ci si trova in una textarea, il char viene aggiunto molte volte, questo si riferisce alla pressione del tasto). Per le condizioni handle-once, utilizzare l'evento key-down o key-up in base alle proprie esigenze. Sia la key-up che il key-down sono attivati ​​una sola volta. Funziona così:

{Key-Down} {Key-Press} {Key-Press} ..(as long as key is down).. {Key-Press} {Key-Up} 
1

Provare a cambiare "pressione tasto" su "keydown".

L'evento di pressione tasto viene inviato a un elemento quando il browser registra l'input da tastiera. È simile all'evento keydown, tranne nel caso di ripetizioni di tasti. Se l'utente preme e tiene premuto un tasto, viene attivato un evento keydown una volta, ma vengono attivati ​​eventi di pressione tasti separati per ogni carattere inserito.

Da http://api.jquery.com/keypress/

1

La documentazione per gli stati di pressione dei tasti:

Come il metodo .keypress() è solo una scorciatoia per .on ("pressione di un tasto", handler), il distacco è possibile usando .off ("keypress").

Pertanto, è possibile staccare il gestore aggiungendo .off() prima della rilegatura. Sostituirei anche la funzione .bind() con .on() poiché bind è ora deprecato. Qualcosa del genere dovrebbe funzionare:

$('body').off().on('keypress', function(e) {