Ieri mentre cercavo di sistemare un insolito bug in una applicazione web mi sono accorto di un problema con l'evento
onkeydown e firefox (non ho controllato con gli altri browser, mi sembrava sufficiente che si verificasse con firefox). Questo evento come molti di voi sapranno ha la funzione di notificare l'applicazione javascript del fatto che qualcuno ha premuto un tasto nel contesto di un elemento della pagina. Tale evento funziona piu' o meno con qualunque elemento, e ha un evento simmetrico per nome e funzionalita' che viene invece invocato quando un tasto viene rilasciato:
onkeyup.
Il problema e' che
onkeydown si lascia scappare degli eventi se l'utente digita abbastanza velocemente da tenere per qualche millisecondo piu' di un tasto premuto simultaneamente, o almeno questo e' cio' che accade con firefox.
Guardate questo esempio:
Provate a premere un po' di tasti e guardate cosa appare nell'area gialla. E' il codice del tasto premuto. Ora pero' se provate a:
- premere la A, senza lasciarla
- premere la B, senza lasciarla
- rilasciare la B
- rilasciare la A
l'effetto e' quello di vedere un solo codice.
A dire il vero e' difficile scrivendo riprodurre tale
condizione. Il problema e' che anche invertendo le ultime
due operazioni, se si esegue la sequenza abbastanza velocemente
l'effetto e' ugualmente di perdersi la B. Questa volta la
sequenza e'
molto facilmente riproducibile senza farlo
apposta mentre si digita velocemente.
Abbastanza stranamente cio' non accade con
onkeyup.
Soluzione? Usate
onkeypress e tutto funziona perfettamente. Tale evento viene invocato quando un tasto viene premuto, esattamente come accade per
onkeydown. La differenza tra i due e' che
onkeypress gestisce la ripetizione automatica, cosa a volte non desiderabile, e che invece di catturare il codice del tasto cattura il codice del carattere generato, sono due cose abbastanza diverse, se volete addentrarvi leggete
questo documento, ma in genere e' desiderabile
onkeypress anche da questo punto di vista, potete distinguere tra maiuscole e minuscole. In breve l'evento
onkeypress e'
di piu' alto livello dunque meno incompatibile tra diversi browser e sistemi operativi. Tornando al nostro problema per fortuna in molte applicazione di
onkeydown si puo' benissimo usare
onkeypress. Altre volte no... ma magari in quei casi e' accettabile che i tasti premuti simultaneamente non funzionino come si vorrebbe.
Visto che mi basta fare cut&paste... ecco a voi l'esempio con onkeypress ;)