Axel Richter: 2 Probleme mit DHTML

Beitrag lesen

Hallo,

Ich hab dir die Dateien per Mail geschickt, groß sind sie ja noch nicht ;)

Bitte mach das nicht mehr. Der Sinn eines Fachforums ist es, Probleme _dort_ bis zum Ende auszudiskutieren. Das hat den Grund, dass andere Anwender, die Lösungen zu diesem Problem suchen, diese auch finden. Was nutzt denen die Aussage: "Ich hab Dir das mal gemailt." Wenn Du also keine Testseite hochladen kannst, dann poste hier den relevanten Quellcode.

Dieses Phänomen finde ich irgendwie witzig..

Nein ;-). Es ist das typische Problem von: "Um Rekursion zu verstehen, muss man zunächst mal Rekursion verstanden haben."

Du hast folgende Schleife:

for(i=0; i<dynamisch.childNodes.length; i++) {
        alert(dynamisch.childNodes.length);
        dynamisch.removeChild(dynamisch.firstChild);
}//for

Das dynamisch.removeChild(dynamisch.firstChild) ändert aber die Anzahl der childNodes in dynamisch. Dadurch wird der Endwert dynamisch.childNodes.length nach jedem Durchlauf der for-Schleife um 1 geringer. Die Schleife wird also nie alle childNodes entfernen. Nehmen wir an, dynamisch.childNodes.length wäre am Anfang 3. In der Schleife wird ein childNode enfernt, dann ist i==1 und dynamisch.childNodes.length==2. Nun wird noch ein childNode enfernt, dann ist i==2 und dynamisch.childNodes.length==1 und die Schleife ist beendet. Ein childNode bleibt übrig, drei kommen neu hinzu. Nun geht das Spiel weiter:
anz==4; i==1; anz==3; i==2; anz==2 --> 2 bleiben übrig
anz==5; i==1; anz==4; i==2; anz==3; i==3; anz==2 --> 2 bleiben übrig
...

Das alert() zeigt übrigens, wie ich drauf gekommen bin.

Die Lösung ist, die Anzahl der childNodes _vor_ der Schleife in einer Variablen zu seichern und _diese_ dann als Schleifenendwertzu nutzen.

var lg_dynamisch = dynamisch.childNodes.length;
for(i=0; i<lg_dynamisch; i++) {
        dynamisch.removeChild(dynamisch.firstChild);
}//for

viele Grüße

Axel