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:
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 ;)
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
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 ;)
Do you like this article?
Subscribe to the RSS feed of this blog or use the newsletter service in order to receive a notification every time there is something of new to read here.
Note: you'll not see this box again if you are a usual reader.
Subscribe to the RSS feed of this blog or use the newsletter service in order to receive a notification every time there is something of new to read here.
Note: you'll not see this box again if you are a usual reader.
Comments
13 Feb 07, 03:48:49
Per Max: Oggi con javascript disabilitato ti perdi mezzo web ;) E le vulnerabilita' non sono in una buona implementazione di Javascript (tipo quella di firefox) ma altrove. Non vorrei ad esempio che tu stessi con javascript disabilitato ma sul sistema operativo Windows.
13 Feb 07, 10:00:29
lo so lo so.. per javascript ;)
nessun problema a dirti che io conosco win come la massaia di viggiu' (massimo rispetto eh) conosce un 690.
Io uso linux, solaris ed aix.. ora ad esempio linux.
comunque la mia paranoia e' una specia di gioco, dopotutto.
Ad esempio ecco come io avrei scritto l'indirizzo e-mail nella tua pagina "CV":
antirez@gmail.com
per tutelarmi un po' di piu' dagli spammer -ad esempio-.
Ma impareranno anche questo, prima o poi.
Ciao
nessun problema a dirti che io conosco win come la massaia di viggiu' (massimo rispetto eh) conosce un 690.
Io uso linux, solaris ed aix.. ora ad esempio linux.
comunque la mia paranoia e' una specia di gioco, dopotutto.
Ad esempio ecco come io avrei scritto l'indirizzo e-mail nella tua pagina "CV":
antirez@gmail.com
per tutelarmi un po' di piu' dagli spammer -ad esempio-.
Ma impareranno anche questo, prima o poi.
Ciao
14 Feb 07, 03:43:05
Per di più onkeydown non si becca nemmeno la pressione dei tasti TAB e ESC (per ora solo con questi mi sono accorto).. Almeno sul mio firefox, non ho avuto tempo di testarlo a fondo :P
premo i tasti ma non succede nulla.. e spero pure non succeda nulla (che io non voglia) nei tuoi logs
ciao