2008-04-18

Web browsers differences (sic!)

Wszystko działa dopóki nie sprawdzisz tego w IE... no niestety różnice w silnikach wszystkich przeglądarkach są ogromne. Nie zwalam tutaj całej winy na Microsoft, każda przeglądarka ma jakieś odchyły od normy. Tutaj padło akurat na IE.
Postanowiłem dynamicznie potworzyć sobie content strony za pomocą DOM. Wszystko ładnie zadziałało i nawet się przekonałem do takiego sposobu dodawanie lub usuwania elementów. Problem pojawił się przy usuwaniu konkretnych wierszy tabeli. Firefox, Opera kasowały, IE nie...
Problem analizował długo wrzucając alert() gdzie się da ;). Wynik poszukiwań: winną okazała się funkcja getElementsByName(name); . Wartość length wiązki elementów do której wrzuciłem wynik metody w ffoxie pokazywał np. 3 (co odpowiadało prawdzie) a w IE:0.
Po przeszukaniu sieci potwierdziły się moje obawy. Najpierw wyczytałem że getElementsByName w IE nie zwraca poprawnie wiązki w blokach DVI, SPAN i TR, lecz okazało się to nieprawdą. Metoda ta nie działa kiedy dynamicznie utworzymy elementy strony właśnie poprzez DOM.
Szybko jednak można to obejść. Posłuży do tego metoda getElementsByTagName(name). Pobrałem wszystkie TRki do wiązki, przeszukałem je pętlą i pousuwałem te, których nazwy szukałem.
  1. wiersze = document.getElementsByTagName("TR");
  2. var i=0;
  3. while(i< wiersze.length){
  4. if(wiersze[i].getAttribute("name")==szukanaFraza){
  5. objPar = wiersze[i].parentNode;
  6. objPar.deleteRow(wiersze[i].rowIndex);
  7. i=0;
  8. continue;
  9. }
  10. i++;
  11. }


Potem przeszukałem jeszcze raz Internet pod tym kątem i oto co znalazłem (przyda się nieraz!):
http://www.dreamincode.net/code/snippet293.htm
  1. function getElementsByName_iefix(tag, name) {
  2. var elem = document.getElementsByTagName(tag);
  3. var arr = new Array();
  4. for(i = 0,iarr = 0; i < style="color: rgb(0, 102, 0);">length; i++) {
  5. att = elem[i].getAttribute("name");
  6. if(att == name) {
  7. arr[iarr] = elem[i];
  8. iarr++;
  9. }
  10. }
  11. return arr;
  12. }

No i jeszcze na dodatek na stronie MSDN czytamy że getElementsByName sczytuje zarówno elementy o podanym name jak i id :/ to już troszkę przykre.

Pomógł Maryn.