[ MilosDj @ 20.09.2010. 13:03 ] @
Nije mi jasno zasto se DOM i addChild() ponasaju ovako:

Pseudo code:
Code:
var xml=loadDoc("filename");

nodes=xml.getElementsByTagName('tag');

node=searchById(nodes, 'id');  // for, childNodes,  attrib id == id...
//Prakticno node = getElementById(id);

var div document.getElementById('ekran');

div.addChild(node); // sve super, prikaze node

div.innerHtml="";  // odlicno, obrise node iz div ekrana, div bude prazan

I onda ide nebuloza:

node=searchById(nodes, 'id');  // node = null;
nodes.length == prethodna vrednost -1
Kakve veze ima HTML DOM sa ucitanim xml fajlom?
Sta tacno radi addChild()?
Sta tacno radi removeChild()?
Kako je div.innerHTML="" === xml.removeChild() ???
Gde gresim?


Na kraju sam "resio" problem ovako:
Code:
var x=node.cloneNode(true);
div.addChild(x);
Ali mi i dalje nije jasno kako i zasto bilo sta radjeno na document.body... moze da menja xml ???

Koji je onda pravilan nacin za prilazivanje i sklanjanje noda iz <div>???


[ lukeguy @ 20.09.2010. 13:51 ] @
Davno sam radio nešto slično i koliko se sećam kad menjaš innerHtml browser odmah parsira tvoj HTML i menja DOM. Tako da ako staviš prazan string u innerHtml to je isto kao da si uklonio čvor sa RemoveNode(). Tada sam čitao i da nije dobro mešati ta dva načina, već treba uvek koristiti DOM traversal metode.

AddChild() samo dodaje child node roditelju, tj. child node dobija novog roditelja. Ako obrišeš taj node, on nestaje iz stabla. AddChild() ne klonira node koji dodaješ.

Ako samo treba da sakriješ node, postavi mu visibility na hidden (node.style.visibility = 'hidden').

[ MilosDj @ 20.09.2010. 16:33 ] @
Citat:
Davno sam radio nešto slično i koliko se sećam kad menjaš innerHtml browser odmah parsira tvoj HTML i menja DOM.
To mi je skroz jasno. To i zelim da se desi za HTML.

Ali mi nije jasno kako i zasto bilo kakvo brisanje u HTML DOM utice na xml node ucitan iz fajla?
Kao da addChild nekako spoji html i xml fajl. Zasto i kako se to desava?

Citat:
AddChild() samo dodaje child node roditelju, tj. child node dobija novog roditelja. Ako obrišeš taj node, on nestaje iz stabla. AddChild() ne klonira node koji dodaješ.
Hoces da kazes da kad nadjem node sa getElementsByTagName() i taj node uguram u neko DOM stablo sa addChild(node) on automatski iscupa taj node iz originalnog stabla???
[ lukeguy @ 20.09.2010. 17:04 ] @
Pa da, AddChild() ne klonira čvor, ti stalno radiš sa istim čvorom. Tako da ga ti premeštaš iz jednog stabla u drugo.

Kažem ti, davno sam radio, ali nema mi mnogo smisla da se ponaša na jedan način ako radiš sa jednim stablom, a drugačije ako radiš sa XML stablom. Šta ti vraća loadDoc() metoda?
[ MilosDj @ 20.09.2010. 18:03 ] @
U lave, ovo bas nisam znao! Da potvrdim da sam dobro shvatio:

Code:
var nodes = xml.getElementsByTagName(tag);    // vraca NodeList objekat.

var node = nodes[0];    // izvucem node koji mi je potreban.

node;    //  je shortcut na node koji se i dalje nalazi u xml!!!
Mogu da saznam .nodeType .NodeValue .parentNode i ostalo.
I u tom slucaju parentNode mi daje parent iz xml.

Cool...


Ali ako uradim document.body.addChild(node); node je usao u html body. I automatski je uradjen xml.removeChild(node). Kao list koji otkines sa jednog drveta i nakalemis ga na drugo?
I parentNode bi bio div... Ok, testiram.
Citat:
edit:
Node lociran pomocu getElementByTagName iz xml-a
XML parent: [object Element]

Posto je node ubacen u html DOM sa addChld(node)
HTML parent: [object HTMLDivElement]

I dalje mi je cudno sto addChild cupa nodove iz originalnog stabla, ali sad kad znam za foru, cloneNode() cu mnogo vise upotrebljavati.




div.innerHTML=""; sam koristio za brisanje svega iz div-a.
Deluje mi mnogo brze i jednostavnije nego while(hasChildren)(.removeChild(..)). Prakticno, to je jedino mesto gde koristim innerHTML.


loadDoc(filename) vraca root node iz xml fajla. root node, sa svom decom naravno. preuzeo sam je sa w3schools.com

[Ovu poruku je menjao MilosDj dana 20.09.2010. u 19:56 GMT+1]