Rekursionsprobleme
Jeremias
- javascript
0 MudGuard0 Jeremias0 Christian Kruse0 Struppi0 MudGuard
0 Vinzenz0 Vinzenz
0 Antje Hofmann0 Jeremias
Moin!
Noch ein Problem...
in einer Datenmäßig sehr umfangreichen Tabelle soll der Browser aus Performance-Gründen nur sichtbare Elemente bearbeiten.
Die Elemente sind abwechseld mit <div> und <table> hierarchisch ineinander verschachtelt. Hierarchisch tieferliegende Elemente können auf diese Art per Doppelklick auf/zugeklappt gemacht werden.
In dem Beispiel hier soll er Checkboxen abhaken.
Der Quelltext sieht mir richtig aus, aber aus irgendeinem Grund funktionierts nicht. Er hakt immer nur die 1. Checkbox einer Verschachtelung ab.
Wenn nicht: was stimmt mit dem Code nicht?
Wird von anderer Funktion mit (Div-Element) aufgerufen.
function gothrough(curNode){
if(curNode.type == "checkbox"){
curNode.checked = "true";
}
if(curNode.firstChild && curNode.style.display != "none"){
gothrough(curNode.firstChild);
}
if(curNode.nextSibling && curNode.style.display != "none"){
gothrough(curNode.nextSibling);
}
}
Hi,
function gothrough(curNode){
if(curNode.type == "checkbox"){
müßte zu einem Fehler (und damit Abbruch) führen, wenn das curNode kein type-Attribut bzw. type-Unterobjekt hat.
Erst prüfen, ob curNode.type existiert, dann, welchen Wert es hat.
curNode.checked = "true";
}
if(curNode.firstChild && curNode.style.display != "none"){
Hier prüfst Du, ob die Methode firstChild vorhanden ist, ok, aber Du prüfst NICHT, ob es auch ein erstes Kind gibt (dazu müßte ja ein Aufruf der Methode erfolgen)
gothrough(curNode.firstChild);
Hier übergibst Du die Methode firstChild als Parameter.
Willst Du hier vielleicht das Ergebnis des Aufrufs übergeben?
Ein Aufruf ist durch die (ggf. leere) Parameterliste in Klammern gekennzeichnet.
if(curNode.nextSibling && curNode.style.display != "none"){
gothrough(curNode.nextSibling);
analog zu firstChild.
cu,
Andreas
Viele Dank für die Antwort!
Hab's gleich ausprobiert und nachgeschaut...
function gothrough(curNode){
if(curNode.type == "checkbox"){müßte zu einem Fehler (und damit Abbruch) führen, wenn das curNode kein type-Attribut bzw. type-Unterobjekt hat.
Erst prüfen, ob curNode.type existiert, dann, welchen Wert es hat.
Dachte jeder Knoten hat das type-Attribut? Kriege auch keine Fehlermeldung, das Skript läuft ohne Abbruch durch.
curNode.checked = "true";
}
if(curNode.firstChild && curNode.style.display != "none"){Hier prüfst Du, ob die Methode firstChild vorhanden ist, ok, aber Du prüfst NICHT, ob es auch ein erstes Kind gibt (dazu müßte ja ein Aufruf der Methode erfolgen)
Meinst du mit try..catch? Glaube nicht, dass das nötig ist. Hatte woanders eine Schleife:
while(document.getElementsByName(irgendeinname)[i]){
...anweisungen...
i++;
}
Die lief auch korrekt durch.
gothrough(curNode.firstChild);
Hier übergibst Du die Methode firstChild als Parameter.
Willst Du hier vielleicht das Ergebnis des Aufrufs übergeben?
Ein Aufruf ist durch die (ggf. leere) Parameterliste in Klammern gekennzeichnet.
Zitat Selfhtml: firstChild Speichert das Objekt des ersten Kindknotens eines Knotens.
Sonst müsste ich bei Zugriffen die Klammern ja auch angeben (zB xyz.firstChild().data). Oder hab ich das jetzt falsch verstanden?
Habs zur Sicherheit ausprobiert: mit Klammern tut sich gar nix (- er bringt aber auch keine Fehlermeldung)
if(curNode.nextSibling && curNode.style.display != "none"){
gothrough(curNode.nextSibling);analog zu firstChild.
Siehe dazu http://selfhtml.teamone.de/javascript/objekte/node.htm#next_sibling - da steht im Beispiel "Knoten = Knoten.nextSibling;", also ohne Klammern (nicht "Knoten = Knoten.nextSibling();").
Hat also leider nicht viel geholfen - trotzdem vielen Dnak für die Antwort.
Gruß, Jeremy
Hallo MudGuard,
curNode.checked = "true";
}
if(curNode.firstChild && curNode.style.display != "none"){Hier prüfst Du, ob die Methode firstChild vorhanden ist, ok, aber Du prüfst NICHT, ob es
auch ein erstes Kind gibt (dazu müßte ja ein Aufruf der Methode erfolgen)
Irrtum, firstChild ist keine Methode sondern ein Attribut.
gothrough(curNode.firstChild);
Hier übergibst Du die Methode firstChild als Parameter.
Attribut.
if(curNode.nextSibling && curNode.style.display != "none"){
gothrough(curNode.nextSibling);analog zu firstChild.
Auch nextSibling ist ein Attribut.
Grüße,
CK
function gothrough(curNode){
if(curNode.type == "checkbox"){müßte zu einem Fehler (und damit Abbruch) führen, wenn das curNode kein type-Attribut bzw. type-Unterobjekt hat.
Erst prüfen, ob curNode.type existiert, dann, welchen Wert es hat.
Auch das ist falsch.
var test = new Object();
alert( (test.type == 'quatsch'));
du kannst auf unbekannte Attribute zugreifen, was nicht geht ist:
alert( (test2.type == 'quatsch'));
Also er müßte erst prüfen, ob curNode existiert, wenn ja kann er den test oben machen:
function gothrough(curNode){
if(curNode && curNode.type == "checkbox"){
Struppi.
Hi,
okok, ich ziehe mein Posting zurück...
cu,
Andreas
Hallo Jeremias
...
if(curNode.nextSibling && curNode.style.display != "none"){
gothrough(curNode.nextSibling);
}
}
Wieviele Geschwisterknoten erreichst Du damit maximal?
Skizziere Deinen Algorithmus auf Papier mit einem Baumdiagramm, bei dem ein Knoten auch mal mehr als zwei Kindknoten besitzt. Kann Dein Algorithmus den dritten Kindknoten erreichen?
Meine Vermutung (Syntax habe ich nicht überprüft): while statt if
Freundliche Grüsse,
Vinzenz
Hallo Vinzenz
Wieviele Geschwisterknoten erreichst Du damit maximal?
Doch alle, war ein Gedankenfehler meinerseits :-(
Freundliche Grüsse,
Vinzenz
Hallo Jeremias,
if(curNode.firstChild && curNode.style.display != "none"){
^^^^^^
hier liegen deine Probleme. Textknoten kennen das Objekt style und deshalb die Eigenschaft display nicht. Dies führt zu einem Fehler und damit zu einem Abbruch.
Du musst deine Rekursion so modifizieren, dass auch der Fall Textknoten (in Mozilla ist es schon ein einfacher Zeilenumbruch zur Formatierung des Quelltextes) behandelt wird.
Viele Grüße
Antje
Hallo Jeremias,
if(curNode.firstChild && curNode.style.display != "none"){
^^^^^^
»»hier liegen deine Probleme. Textknoten kennen das Objekt style und deshalb die Eigenschaft display nicht. Dies führt zu einem Fehler und damit zu einem Abbruch.
Sorry, daran liegt es nicht (Du hast zwar recht, aber dafür habe ich anders vorgesorgt, das war eines meiner früheren Probleme).
Wie gesagt, er läuft Fehlerfrei ohne Abbruch durch.
Trotzdem erreicht er nur den die erste Checkbox jeder Hierarchie...
Trotzdem Danke, Jeremy