Rekursiver Aufruf und Rückgabe von Werten
Tina
- javascript
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
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.
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
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]
Hallo Gast,
Hast du gesehen, dass ich auf Menschelei umgestellt habe?
Kennst du die Geschichte, wie Programmierer Elefanten suchen?
Gruß, Jürgen
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
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?
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
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
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
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 ;)
Cü
Kai
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
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
Hallo an alle,
danke für die Hilfe. Funktioniert nun.
Gruß
Tina
ich habe folgenden Javascript Code:
function determineRoot(element)
{
if(element.parentNode.id=='test'))
Warum verwendest du nicht einfach getElementById('test')?
Struppi.
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