[JS] przejście przez drzewo DOM

0

Witam, znalazłem kod do przejścia po drzewie DOM jednak mam z nim problemy.

Przykładowe drzewo:

<html>
<head>
</head>
<body id="bd">
<div id="dv1"><div id="dv2"><div id="dv3">
</div></div></div>
<span id="spn"></span>
</body>

</html>
<script language="javascript" src="demo.js"></script>

demo.js:

window.onload=treeTraverseIterative(document.body);
function treeTraverseIterative(elem) {
	var queue = new Array();
	var i, currentElem, childs, tagname;
    var ids='';
    
	queue.push(elem);
	while (queue.length > 0) { 
		currentElem = queue.pop();

		tagname=currentElem.tagName.toString();
		if(currentElem.id=='')
			ids+=tagname+' has no id\n';
		else
			ids+=tagname+' has id: '+currentElem.id+'\n';

		if(tagname!="SCRIPT"){
			childs = currentElem.childNodes.length;

			for (i = 0; i < childs; i++) {
				queue.push(currentElem.childNodes[i]);
			}
		}
		if(queue.length==0){
		   alert(ids);
		   return true;
		}
	}
             alert('bla');
}

W tym wydaniu skrypt przechodzi przez wszystkie węzły i sprawdza id a na końcu wyświetla stan id węzłów.

Problem w tym, że po alert(ids); i przed return true; wyrzucany jest bład (w IE) Nie zaimplementowo :/
Whatever :/ jeśli nawet wywale tego if-a to błąd wyskąpi po alert('bla'). Nie wiem o co w tym chodzi ;-(

0

Zrobiłem ci w kodzie taką sztuczkę i zobacz, co się okazało.
Następnym razem debuguj swój kod, ja zawsze gdy coś się nie zgadza używam alert() tam gdzie się da.

window.onload=treeTraverseIterative(document.body);
function treeTraverseIterative(elem) {


         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         alert(elem);  //wyświetla "NULL"


        var queue = new Array();
        var i, currentElem, childs, tagname;
    var ids='';
   
        queue.push(elem);
        while (queue.length > 0) {
                currentElem = queue.pop();

                tagname=currentElem.tagName.toString();
                if(currentElem.id=='')
                        ids+=tagname+' has no id\n';
                else
                        ids+=tagname+' has id: '+currentElem.id+'\n';

                if(tagname!="SCRIPT"){
                        childs = currentElem.childNodes.length;

                        for (i = 0; i < childs; i++) {
                                queue.push(currentElem.childNodes[i]);
                        }
                }
                if(queue.length==0){
                   alert(ids);
                   return true;
                }
        }
             alert('bla');
}
0

mi nie wyświetla null :-) btw robiłem alerta co linie a to już chyba desperacja, nie ;-) poza tym przez te linie zawsze przechodziło a problemem jest wyjście z funkcji

0

Coś mi tu nie pasuje, wiem że IE szaleje, ale przy kolejnym uruchomieniu twojego orginalnego zaczęło działać i pojaił mi się twój problem. Może jak spróbuję jeszcze raz wreszcie zadziała, mi zdarzało się że ta sama strona raz działała, po 5 min przestała a po restarcie kompa znowu ruszyła.

0

Dobra, wiem już o co chodzi:

cj_tomekk napisał(a)

window.onload=treeTraverseIterative(document.body);

Zapisując kod w ten sposób wywołujesz funkcję treeTraverseIterative(), a następnie przekazujesz zwróconą wartość jako funkcję dla zdarzenia onload.

musisz przekazać do onlaoa funkcję nie pobierającą argumentów (bo nie wiem jakie ma to zdarzenie). Najlepiej zrób tak:

window.onload=function(){
  treeTraverseIterative(document.body);
};
0
window.onload=function(){
  treeTraverseIterative(document.body);
};

Nie wiem, czy się nie mylę, ale w niektórych (wielu?) przeglądarkach w tym momencie (wywołania eventu onload) struktura DOM nie musi być jeszcze gotowa. Może dlatego czasem ten skrypt wariuje (mam na myśli elem=null).

1 użytkowników online, w tym zalogowanych: 0, gości: 1