Tina: Rekursiver Aufruf und Rückgabe von Werten

Hallo zusammen,

ich habe folgenden Javascript Code:

function determineRoot(element)
{
        if(element.parentNode.id=='test'))
 {
  return  element.parentNode;
 }
 else
 {
  determineRoot(element.parentNode);
 }
}

Dieser Funktion wird ein HTML-Element übergeben. Sie prüft dann, ob das Elternelement die ID "test" hat. Falls ja, wird das Elternelement zurück gegeben, falls nein wird die Funktion nochmal aufgerufen und das Elternelement übergeben (rekursiv).

Allerdings ist es so, dass ich nie mein gewünschtes HTML Element mit der ID "test" zurück erhalte, da nachdem das gewünschte element zurück gegeben wird, dieses durch die returns der restlichen Rekursionen überschrieben wird (undefined).

Als Lösung könnte ich nun eine globale Variable außerhalb der Funktion definieren und diese zurück geben.

Das würde dann so aussehen:

var myRoot;
function determineRoot(element)
{
        if(element.parentNode.id=='test'))
 {
  myRoot = element.parentNode;
 }
 else
 {
  determineRoot(element.parentNode);
 }
 return myRoot;
}
Ich mag aber globale Variablen nicht so gern. Außerdem wird myRoot dann öfters zurückgegeben (je nach Anzahl der Rekursionen)

Gibt es für diese Aufgabenstellung auch einen anderen Lösungsweg?

Danke im Voraus
Liebe Grüße
Tina

  1. evtl so:

    function determineRoot(element) {
      if (element.id=='test') return element;
      else return determineRoot(element.parentNode);
     }
    }

    evtl. solltest du noch irgendwo das parentNode stoppen, höher als body dürfte es kaum sinnvoll sein.

    1. Hallo Gast,

      evtl. solltest du noch irgendwo das parentNode stoppen, höher als body dürfte es kaum sinnvoll sein.

      oder, wie bei der Elefantensuche, dem body die id "test" geben.

      Gruß, Jürgen

      1. oder, wie bei der Elefantensuche, dem body die id "test" geben.

        ein bisserl Logik:
        es gibt jede ID nur einmal.
        ich suche das Element, das die ID "test" hat
        sicherheitshalber gebe ich dem body die ID "test"

        Daraus folgt:
        dies ist eine sehr umständliche Variante von
        document.getElementsByTagName("body")[0]

        1. Hallo Gast,

          • Hast du gesehen, dass ich auf Menschelei umgestellt habe?

          • Kennst du die Geschichte, wie Programmierer Elefanten suchen?

          Gruß, Jürgen

          1. Hallo Jürgen,

            • Kennst du die Geschichte, wie Programmierer Elefanten suchen?

            nein, ich weiß nur, wie sie sie einfangen: Mit einem Fernglas und einer Pinzette.

            Aber wie sperrt ein Mathematiker einen Löwen in einen Käfig?

            *scnr*
             Martin

            --
            Success should be measured not so much by the position that one has reached in life,
            but by the obstacles one has overcome while trying to succeed.
            1. Hi.

              Aber wie sperrt ein Mathematiker einen Löwen in einen Käfig?

              Er stellt sich in den Kaefig und definiert den rest der Wellt als drinnen?

          2. Hallo

            Jürgen

            • Hast du gesehen, dass ich auf Menschelei umgestellt habe?

            Ja

            • Kennst du die Geschichte, wie Programmierer Elefanten suchen?

            Ja, ich hatte sowas vage vermutet, aber wie wär's wenn du sie verlinkst (ich find sie gerade nicht) statt eine Steilvorlage für logische Spielchen zu geben?

            Gruß

            Gast

            1. Hallo Gast,

              verlinken kann ich sie nicht, ein Freund hat sie mir vor 15 Jahren per Mail zugeschickt:

              Computer scientists hunt elephants by exercising Algorithm A:
              1.  Go to Africa
              2.  Start at the Cape of Good Hope
              3.  Work northward in an orderly manner, traversing the
              continent alternately east and west.
              4.  During each traverse pass,
              a.  Catch each animal seen
              b.  Compare each animal caught to a known elephant
              c.  Stop when match is detected.

              Experienced computer programmers modify Algorithm A above by
              placing a known elephant in Cairo to ensure that the algorithm
              will terminate.  Assembly language programmers prefer to execute
              Algorithm A on their hands and knees.

              Ich hoffe, jetzt ist klar, warum der body die ID "test" haben soll.

              Gruß, Jürgen

              1. Hallo,

                verlinken kann ich sie nicht, ein Freund hat sie mir vor 15 Jahren per Mail zugeschickt:

                Google findet alles:

                PACHYDERMIC PERSONNEL PREDICTION

                Gruß, Jürgen

              2. Grütze .. äh ... Grüße!

                verlinken kann ich sie nicht, ein Freund hat sie mir vor 15 Jahren per Mail zugeschickt:

                Das geht aber noch weiter ;)

                Elefantenjagd (Deutsch)


                Kai

                --
                What is the difference between Scientology and Microsoft? One is an
                evil cult bent on world domination and the other was begun by L. Ron
                Hubbard.
                ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
        2. Hi,

          dies ist eine sehr umständliche Variante von
          document.getElementsByTagName("body")[0]

          welches eine sehr umständliche Variante von
          document.body
          ist.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hello,

    function determineRoot(element)
    {
            if(element.parentNode.id=='test'))
    {
      return  element.parentNode;
    }
    else
    {
      determineRoot(element.parentNode);
    }
    }
    dieses durch die returns der restlichen Rekursionen überschrieben wird (undefined).

    und das wundert dich? Du verwirst das Ergebnis des Rekursionsaufrufs!
    wenn du return determineRoot(element.parentNode) verwendest, sollte sich das Problem lösen.

    MfG
    Rouven

    --
    -------------------
    He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
  3. Hallo an alle,

    danke für die Hilfe. Funktioniert nun.

    Gruß
    Tina

  4. ich habe folgenden Javascript Code:

    function determineRoot(element)
    {
            if(element.parentNode.id=='test'))

    Warum verwendest du nicht einfach getElementById('test')?

    Struppi.

    1. Hi,

      function determineRoot(element)
      {
              if(element.parentNode.id=='test'))

      Warum verwendest du nicht einfach getElementById('test')?

      Weil das was anderes ist.

      Folgende Struktur (auf's wesentliche reduziert):
      html
        body
          element mit id='test'
          anderes Element
            ganz anderes Element

      Rufe determineRoot mit 'ganz anderes Element' auf. Es kommt zum Fehler, weil die Abfrage, ob parentNode existiert, fehlt - der Zugriff auf die id geht dann schief, wenn element das HTML-Element ist.

      getElementById('test')          liefert das Element mit id='test', wenn es existiert.
      determineRoot(irgendeinElement) liefert das Element mit id='test', wenn es existiert und Vorfahr von irgendeinElement ist.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.