2012-08-29 9 views
16

sono caduto fallo di Firefox keydown comportamento in che premendo il tasto Invio (anzi un tasto qualsiasi) senza dover concentrarsi su un campo specifico non si innescherà un evento keydown sarà solo grilletto a keypress evento.event.keyCode vs event.which

Questo potrebbe essere molto fuorviante in quanto l'utilizzo dell'evento keydown e keyup JavaScript codici chiave mentre pressione del tasto utilizza codici ASCII. Fortunatamente 13 (invio/restituzione) è comune a entrambi.

Esiste un motivo noto per cui FF utilizza pressione tasto in questa circostanza? Qual è il vantaggio?

Una volta che questo è stato istituito IE8 ha gettato una sciocca, in quanto non consente preventDefault chiedendo invece returnValue = false il seguente frammento da un altro SO post è rivelato molto utile:

event.preventDefault ? event.preventDefault() : event.returnValue = false; 

Durante la ricerca per risolvere questi problemi Sono stato costantemente confuso da event.keycode vs event.which. Vale a dire faccio di sbagliato con un'istruzione switch simile a:

$("#class_Name").bind("keydown", function(event){ 
    // do not test input if field controls used 
    switch(event.which){ 
     case 13: 
     //enter key 
     event.preventDefault ? event.preventDefault() : event.returnValue = false; 
     break; 
    } 


è la seguente meglio, se sì perché?

$("body").keypress(function(event){ 
    // stop inadvertant form submission 
    if (event.keycode == "13"){ 
     event.preventDefault ? event.preventDefault() : event.returnValue = false; 
    } 
}); 


Vorrei solo sapere in modo che io so che è meglio applicare.

Molte grazie.

+1

Lo sai che jQuery normalizza le differenze tra i browser? In jQuery, 'event.which' dovrebbe essere coerente tra i vari browser. Inoltre, 'event.preventDefsult();' funziona anche in oldie. –

+0

@Rob W, Ciao Rob sì, ne ero consapevole. La documentazione jquery online documenta l'uso dell'evento. Che ho usato. Molti post mostrano qui di seguito keycode non quale. Da qui la domanda. Capisco that event.preventDefsult(); dovrebbe funzionare ovunque – codepuppy

+0

Ti chiedi se possiamo ottenere un aggiornamento su questo per i browser rilevanti nel 2016? – Faust

risposta

10

Alcuni browser utilizzano keyCode e altri utilizzano which. Ma con jQuery questo è normalizzato quindi non devi pensarci. Puoi solo scegliere quello che preferisci.

+3

solo per il caso in cui l'evento è stato generato da jquery stesso. Catturare eventi nativi e normalizzarli non è possibile – Toskan

7

Secondo this comment jQuery può essere inaffidabile e this page dice:

event.which non è definito in IE < 9 su keydown e keyup.

event.keyCode è 0 in Gecko (Seamonkey, Firefox) su keypress per le chiavi che restituiscono un carattere.

event.charCode è supportato solo su keydown e keyup da Internet Explorer (Mac).

Try it on JSFiddle

+2

Questo mi ha aiutato. Dovrebbe essere la risposta accettata. Sto usando la seguente riga per normalizzare queste proprietà: 'var code = event.which || event.keyCode || event.charCode; ' Questo prende tutto il campo non è nullo o 0. Se sono tutti zero, restituisce 0. –

Problemi correlati