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:

  1. Dacă codul se execută la onclick, în onchange detectez execuția efectuată și nu mai execut nimic
  2. 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 »

Interschimbarea valorilor a 2 variabile

September 25th, 2007 Alex

De la http://www.rubynia.ro/cod/2variabile citesc:

Alte limbaje de programare necesita o variabila temporara pentru a inter-schimba valorile a 2 variabile. Nu si Ruby…

Hai nu mai spune! Ete că vreau să fac un pic pe deşteptul :)

Din C/C++/Java/C#, dacă avem de interschimbat două numere întregi …

int x = 33;
int y = 443;

x = x ^ y;
y = x ^ y;
x = x ^ y;

Implementarea este cu adevărat fără de variabilă temporară :P

Se poate şi pentru pointeri în C/C++, însă compilatorul nu te lasă să faci XOR pe pointeri decât dacă faci casting la un tip întreg. Şi dilema standardului de C este că nu prea cunoşti tipul întreg în care ai putea reţine adresa conţinută de un pointer, şi dacă foloseşti tipul “unsigned int” de exemplu pot apărea erori la conversie.

Pentru o implementare corectă avem nevoie să spargem adresa ţinută de pointer într-un vector de octeţi şi să facem XOR pe fiecare octet în parte …

char* xor(char *a, char *b) {
short i;
for (i=0; i<sizeof(char*); ++i)
((char*)&a)[i] = ((char*)&a)[i] ^ ((char*)&b)[i];
return a;
}

// ...

char *p = "hello world!";
char *q = "hello again!";

p = xor(p,q);
q = xor(p,q);
p = xor(p,q);

printf("p = %s\n", p);
printf("q = %s\n", q);

That’s what I call fun :)

Revenind la http://www.rubynia.ro, este doar o schemă de marketing pentru firma din spate, şi nu că ar fi ceva rău în asta, dar de la o publicaţie ce se vrea “sursa ta de Ruby in Romana” mă aşteptam la mai multă transparenţă, şi butonul de înregistrare nu l-am găsit pe nicăieri. Păcat.

Posted in rant, soft-hack | No Comments »