ďťż

[JavaScript] Pętla i tablica. Dlaczego czyta co drugi wyraz?

       

Podstrony


telcocafe

Mam taki kod:
function f4(xmlRoot, div_e){ div_e.innerHTML=""; var n=xmlRoot.getElementsByTagName('p'); alert("n.length="+n.length); for(var i=0; i<n.length; i++){ div_e.appendChild(n[i]); } }
Kod ma dopisać do DIVa kolejne węzły z dokumentu XML. Dokument ma 12 węzłów <p>. Okienko wywołane przez alert pokazuje, że tablica ma długość 12, czyli wszystko się zgadza. Ale po wykonaniu pętli mam dodane tylko 6 węzłów: pierwszy, trzeci, piąty i ogólnie nieparzyste tylko. Na dodatek dodane elementy <p> ignorują styl CSS mimo, że jest zdefiniowany po prostu dla selektora p. Męczę się z tym już trochę i nie mam pomysłu co jest źle ani co by tu jeszcze sprawdzić.



Od razu przepraszam, że post za postem piszę, ale pierwszy to pytanie, a ten to odpowiedź :)
No niestety, nikt nic nie napisał, a ja musiałem znaleźć jakieś rozwiązanie, więc skoro znalazłem, to podaję. Otóż znajomy doradził mi, żebym z pętli wyciągnął i<n.length. Zastąpiłem to tak:
var wymiar=n.length , a w pętli dałem for(var i=0; i<wymiar; i++)
I wtedy wszystko się wyjaśniło (może nie tak od razu...).
Błędne okazało się założenie, że sprawa dotyczy tablicy. getElementsByTagName zwraca kolekcję obiektów. Gdzieś między wierszami różnych opisów znalazłem, że appendChild nie kopiuje elementu. Co za tym idzie po wykonaniu tej funkcji jest on usuwany z kolekcji, a n.length zmniejsza się. Tak więc wystarczyło zmienić warunek w pętli i dać div_e.appendChild(n.item(0)) (zero zamiast i). Tak zmieniony kod zaczął działać... z wyjątkiem jednej przeglądarki.
Sprawa dotyczy ogólnie czegoś, co się nazywa AJAX. W xmlRoot mam zapisane responseXML. W moim przypadku xml zawiera fragment kodu XHTML do wstawienia na żywca w div. Niestety, dla niebieskiego e trzeba mi było uciec się do sztuczek z czegoś, co się nazywa AHAH. Trochę to nieeleganckie, ale ma jedną zaletę: działa pod trzema przeglądarkami. Poniżej ostateczny kod funkcji, z którą miałem problemy. Może komuś się kiedyś przyda. Właściwie temat jest do zamknięcia, chociaż chętnie usłyszę jakąś opinię na ten temat, ewentualnie podpowiedzi na lepsze rozwiązanie.
function f4(xmlRoot, div_e){ var g=div_e.childNodes; var s=g.length; for( var i=0; i<s; i++){ div_e.removeChild(g.item(0)); } var n=xmlRoot.childNodes; var c=n.length; var xt; if(window.ActiveXObject){ for(var i=0; i<c; i++){ xt=n.item(i); div_e.innerHTML=div_e.innerHTML+xt.xml; } } else{ for(var i=0; i<c; i++){ xt=n.item(0); div_e.appendChild(xt); } } }

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.