Jeremias: Rekursionsprobleme

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);
        }
}

  1. 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

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. 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

    2. 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

      --
      Es gibt keinen Ort, wo der Geist zu finden waere. Er ist wie die Fussspuren der Voegel am Himmel.
    3. 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.

    4. Hi,

      okok, ich ziehe mein Posting zurück...

      cu,
      Andreas

      --
      MudGuard? Siehe http://www.Mud-Guard.de/
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. 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

    1. Hallo Vinzenz

      Wieviele Geschwisterknoten erreichst Du damit maximal?

      Doch alle, war ein Gedankenfehler meinerseits :-(

      Freundliche Grüsse,

      Vinzenz

  3. 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

    1. 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