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:
  • 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 ;)
3614 views*
Posted at 04:57:26 | permalink | 6 comments | print
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.

Comments

Max writes:
12 Feb 07, 14:26:09
Hei dico :) ma non penserai sul serio che un vecchio _ultra_ paranoid-style giri tutto nudo con javascript java ecc ecc attivati!!
premo i tasti ma non succede nulla.. e spero pure non succeda nulla (che io non voglia) nei tuoi logs
ciao
antirez writes:
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.
Max writes:
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
napyfab writes:
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
napyfab writes:
14 Feb 07, 03:54:25
Ho sbagliato.. E' sull'onkeyup che non becca quei tasti.. Scusate..
Navigatore Anonimo writes:
11 Apr 07, 09:46:26
abc
comments closed