molily: Rekursive Auflistung aller Kindknoten

Beitrag lesen

Hallo, zusammen.

Um mir das DOM zu verdeutlichen, habe ich versucht, ein Skript zu schreiben, welches mir alle Kindknoten in einem Dokument auflistet. So habe ich mir mal wieder eine sinnlose Aufgabe gestellt, an der ich verzweifle, wollte ich doch eigentlich nur mein Skript verbessern, welches dem Benutzer gestattet, W3C Core Styles dynamisch via DOM anzuwenden.
Ich habe es zwar geschafft, eine mehr oder weniger praktikable Lösung zu finden - womit ich gar nicht gerechnet hatte -, dennoch gibt es verschiedenartige Probleme.

Nun einmal zum Quellcode.

[Kopf gekürzt ;)]
--8<--
<html>
<head>
<script type="text/javascript">
<!--
var max_objekte=100; // Anzahl der maximal zu auszugebenden Knoten
var objektindex=0; // Objektzähler
var ebene=1; // Beinhaltet während der Laufzeit die momentane Verschachtelungsebene
var ausgabe="";

function liste_unterknoten (knoten) {
 objektindex++;
 ausgabe+="|"; for (k=1; k<ebene; k++) ausgabe+="   |";
 ausgabe+=("- Typ: ["+knoten.nodeType+"] Name: [<b>"+knoten.nodeName+"</b>] Wert: [<b>"+knoten.nodeValue+"</b>] Unterknoten: ["+knoten.childNodes.length+"]\n");
 if (knoten.hasChildNodes()) {
  ebene++;
  for (i=0; i<knoten.childNodes.length; i++) {
   knotenneu=knoten.childNodes[i];
   if (objektindex<max_objekte) liste_unterknoten(knotenneu); // Rekursion
  }
  ebene--;
 }
}
//-->
</script>
</head>

<body>

<!-- Beispieldokument (dieser Kommentar ist auch ein Unterknoten) -->
<h1>&Uuml;berschrift #1</h1>
<h2>&Uuml;berschrift #2</h2>
<p>eins <a href="corestyles-dom.html">zwei</a> drei <b>vier</b> fünf <i>sechs</i> sieben <u>acht</u> neun</p>

<script type="text/javascript">
<!--
liste_unterknoten(document.getElementsByTagName("body")[0]); // Rufe Funktion auf, beginne beim body-Element
document.write("<pre>"+ausgabe+"</pre>"); // Schreibe Ausgabe
//-->
</script>

</body>
</html>
-->8--

Zugegebenermaßen wirkt der Quelltext eher funktionell als elegant, da ich mich doch erst seit kurzem in das Thema einarbeite. Wieso gibt die Funktion die Daten nicht direkt aus, sondern reiht sie in der Variable ausgabe auf? Weil die Browserinstanzen das Zeitliche segnen, falls man ausgabe+= durch document.write ersetzt (daher noch die übriggebliebenen Klammern als Relikte vorheriger Versionen).

Ausgabe ist wie folgt (IE):
|- Typ: [1] Name: [BODY] Wert: [null] Unterknoten: [5]
|   |- Typ: [8] Name: [#comment] Wert: [ Beispieldokument (dieser Kommentar ist auch ein Unterknoten) ] Unterknoten: [0]
|   |- Typ: [1] Name: [H1] Wert: [null] Unterknoten: [1]
|   |   |- Typ: [3] Name: [#text] Wert: [Überschrift #1] Unterknoten: [0]
|   |- Typ: [1] Name: [H2] Wert: [null] Unterknoten: [1]
|   |   |- Typ: [3] Name: [#text] Wert: [Überschrift #2] Unterknoten: [0]
|   |- Typ: [1] Name: [H2] Wert: [null] Unterknoten: [1]
|   |   |- Typ: [3] Name: [#text] Wert: [Überschrift #2] Unterknoten: [0]
... ...

Das Script ist lauffähig (getestet auf IE 6.0 und K-Meleon 0.6), ich hoffe, mein Ergebnis ist reproduzierbar. Opera reagiert scheinbar gar nicht.
Das Problem nun liegt darin, dass die Funktion nach ein paar Durchläufen bei zwei Objekten stehenbleibt (s.o.) und diese immer wieder endlos ausgibt. Dies hat mir dutzende Programmabstürze gebracht, bis ich die Limitierung eingebaut habe. Komischerweise crashten die Benutzeragenten auch mit auskommentiertem Rekursionsbefehl - alles in allem erfreulich chaotisch.
Änderungen am Algorithmus haben mich nicht weitergebracht. Ich sehe den Wald vor lauter Bäumen nicht.
Interessanterweise hängt die Rekursionsschleife bei K-Meleon an einer anderen Stelle.

Ausgabe K-Meleon:
|- Typ: [1] Name: [BODY] Wert: [] Unterknoten: [10]
|   |- Typ: [3] Name: [#text] Wert: [

] Unterknoten: [0]
|   |- Typ: [8] Name: [#comment] Wert: [ Beispieldokument (dieser Kommentar ist auch ein Unterknoten) ] Unterknoten: [0]
|   |- Typ: [3] Name: [#text] Wert: [
] Unterknoten: [0]
|   |- Typ: [1] Name: [H1] Wert: [] Unterknoten: [1]
|   |   |- Typ: [3] Name: [#text] Wert: [Überschrift #1] Unterknoten: [0]
|   |- Typ: [3] Name: [#text] Wert: [
] Unterknoten: [0]
|   |- Typ: [1] Name: [H1] Wert: [] Unterknoten: [1]
|   |   |- Typ: [3] Name: [#text] Wert: [Überschrift #1] Unterknoten: [0]
|   |- Typ: [3] Name: [#text] Wert: [
] Unterknoten: [0]
... ...

Die Laus bzw. die Eigentümlichkeit bezüglich der Identifikation der (\r)\n's (<- Plural, nicht Genitiv ;) als Unterknoten ist bei geckoiden Browsern bekannt. Dürfte hier aber nicht der Auslöser des Problems sein. Kann mir jemand helfen...? Vielleicht existiert dort draußen schon eine Lösung. (Selber machen ist natürlich herausfordernder, schließlich ist der Weg das Ziel.)

Grüße,
Ma-'Verwunderung ist der erste Weg zur Weisheit'-thias