Attenti a onkeydown

Monday, 12 February 07
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: 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 ;)
2409 views*
Posted at 09:57:26 | permalink | 6 comments | print