2012-02-01 17 views
7

Questo è probabilmente il comportamento previsto o almeno non un problema jQuery/js ma mi piacerebbe qualche chiarimento se ce n'è uno da avere.jQuery keypress evento si attiva ripetutamente quando si tiene premuto il tasto - ma non su tutti i tasti

adottare le seguenti:

$(document).bind('keypress', function(e){ 
    switch(e.keyCode) 
    { 
     case 37: 
      console.log('left cursor keydown, will fire on hold'); 
      break; 
     case 39: 
      console.log('right cursor keydown, will fire on hold'); 
      break; 
     case 80: 
      console.log('p will only fire once per press!'); 
      break; 
    } 
}); 

Si può anche giocare con l'esempio alla documentazione di jQuery: http://api.jquery.com/keypress/

Quando si preme un cursore a sinistra oa destra (o molti altri tasti, come A,E,[,, ecc), l'evento si attiva e si ottiene un messaggio di registro nella console. Tutto bene & come previsto. Tuttavia, ora prova a tenere premuto il tasto - dopo una breve pausa vedrai che l'evento keydown scatta più volte quando tieni premuto il tasto, tuttavia se provi a colpire uno p (o, ad esempio, un j), verrà attivato solo una volta.

Sto testando questo utilizzando FF 9.0.1 e mac OSX 10.7.1 e jQuery 1.7.1.

È questo in base alla progettazione, è una funzionalità dipendente dal browser, o è a che fare con il sistema operativo, o anche la tastiera stessa? Qualcuno ha anche una lista di chiavi che si ripeteranno e chiavi che non lo faranno?

Per quanto riguarda il caso d'uso, non ce n'è uno in realtà - questo è appena spuntato quando legavo un'animazione a una pressione del cursore e ho iniziato a vedere un comportamento strano quando il tasto è stato premuto. Per risolvere il problema, utilizzare invece l'evento keyup() e preventDefault() sull'evento keydown() per le chiavi in ​​cui ero insterestato, per impedire lo scorrimento dei cursori sullo schermo.

UPDATE: Sembra che l'evento keypress, keyCode è sempre 0 per la maggior parte delle lettere, che potrebbe avere qualcosa a che fare con il motivo per cui ho pensato che il gestore unico licenziato una volta. Dopo alcuni test, vedo le voci del registro ripetute come per i cursori. Se si seleziona la pagina di API jQuery, però, e utilizzare la demo su quella, esibisce il comportamento che descrivevo: http://api.jquery.com/keypress/

Ancora non riesco a spiegare che io stesso:/

+0

Tutti i tasti si ripetono. Devi aggiungere 'break' alla fine di ogni caso switch, a meno che non li lasci intenzionalmente. La tua tastiera non funziona correttamente, o il tuo codice ha semplicemente bisogno di alcuni 'break'. –

+0

Non per me - "p" si ripete bene. Penso che sia una funzione dell'hardware/firmware della tua tastiera. – Pointy

+0

@BrianGraham ha appena notato che, grazie :) dopo aver provato di nuovo su jsfiddle, sto vedendo una ripetizione anche su tutti i tasti - tuttavia il keyCode attr è 0 sulla maggior parte delle chiavi per l'evento keypress, che spiegherebbe alcuni dei comportamenti strani Stavo vedendo lo – jammypeach

risposta

5

comportamento varia tra i browser e sistemi operativi. La seguente pagina copre l'argomento di eventi chiave auto-ripetuto in dettaglio nella sezione 2.2:

http://unixpapa.com/js/key.html

+0

fantastico - questo lo spiega perfettamente, grazie. – jammypeach

1

Questo problema è stato intorno per le età, ma penso di aver scoperto una correzione solo ora. Questo sembra funzionare bene

$("#search_query").keyup(function(event) { 

    //this will void fake keypresses 
    if(event.charCode == 0 && event.keyCode == 0) { 
     return false; 
    } 

    //place the rest of you code here 
}); 
+0

Il suo gelato liscio ... superbo !!! –

Problemi correlati