Javascript - onclick vs. onchange
December 12th, 2007 Alex
Am avut de creat un meniu format din checkbox-uri. La selecția/deselecția unui checkbox, atunci când ai nevoie asociezi anumite acțiuni cu schimbarea stării acelui checkbox, apare următoarea dilemă: onclick, din punct de vedere semantic și chiar și al standardului W3C, nu este device-independent.
O interfață bine construită trebuie să fie accesibilă. Iar asta include compatibilitate cu screen-readere și posibilitatea de operare numai de la tastatură. Desigur, datorită problemelor din IExplorer screen-readerele actuale nu iau în calcul prea mult semantica tipurilor de evenimente, și onclick este perfect acceptabil, iar când selectezi un checkbox din taste se generează oricum onclick, dar nu sunt sigur că situația va rămâne aceași.
IExplorer are însă probleme cu onchange. La selecția unui checkbox onchange este generat abia după ce elementul pierde focusul.
Așa că mi-am propus să creez un script ce execută evenimentul fie la onclick, fie la onchange, în funcție de browser.
Problema este că nici măcar de ordinea evenimentelor nu putem fi siguri. În timp ce pe IExplorer și pe Firefox onchange se execută după onclick, pe Safari onchange se execută înainte de onclick.
Așa că scriptul meu face următoarele:
- Dacă codul se execută la onclick, în onchange detectez execuția efectuată și nu mai execut nimic
- Dacă se execută codul la onchange, atunci nu mai execut nimic la onclick
O a 2-a problemă apare la execuția manuală a funcțiilor onchange/onclick (fără click-ul fizic al mouse-ului), și asta deoarece nu se mai execută ambele evenimente și ne dă peste cap automatul. Ca soluție … detectez dacă evenimentul a fost generat sau nu din checkbox-ul pe care se face schimbarea, și dacă a fost generat de altcineva atunci sărim peste toată procedura de care spuneam și executăm codul fără alte condiții.
Destul de brut procesul, dar merge, și acum folosesc onchange fără frică pe Firefox, IExplorer și Safari (sorry, nu testez pe Opera, dar nu văd de ce n-ar merge).
Atașez codul: onchange1.html
Enjoy ~
Posted in soft-hack, tips&tricks | 3 Comments »