Rekursion
SorgenkindMech
- javascript
moins ihr!
ich hab mal wieder ein problem, und es scheint ähnlich dieses falls zu sein, zu dem nur leider anscheinend keine wirklichen lösungen geboten wurden
http://forum.de.selfhtml.org/archiv/2006/5/t128662/#m831564
meine datei sieht folgendermaßen aus, und sollte mir eigentlich alle nodes auflisten, was ich nachher zum behandeln eines wesentlich größeren dokumentes verwenden will, und das natürlich selektiv:
<html>
<head>
</head>
<body>
<table>
<tr style="display:block" id='test'>
<td nowrap><span title="">bla</span></td>
<td>
<table>
<tr>
<td nowrap>
<input type='radio' name='e_10' id='e_10' value="1">1</td>
<td nowrap>
<input type='radio' name='e_10' id='e_10' value="2">2</td>
<td nowrap>
<input type='radio' name='e_10' id='e_10' value="3">3</td>
</tr>
</table>
</td>
</tr>
</table>
<script language="javascript" type="text/javascript">
instanz=0;
function zeige_nodes(obj)
{
instanz++;
anzahl=obj.childNodes.length;
for(z=0;z<anzahl;z++)
{
document.write("<tr>");
document.writeln("<td>Anzahl: " + String(anzahl) + ", z: " + String(z) + "</td>");
for(i=0;i<instanz;i++)
{
document.writeln("<td> </td>");
}
document.write("<td colspan=30>" + String(obj.childNodes[z].nodeName) + "</td>");
document.writeln("</tr>");
if(obj.childNodes[z].hasChildNodes())
{
zeige_nodes(obj.childNodes[z]);
}
}
instanz--;
}
if(document.getElementById("test").hasChildNodes())
{
document.writeln("<span id=info><table>");
zeige_nodes(document.getElementById("test"));
document.writeln("</table></span>");
}
</script>
<script language="javascript" type="text/javascript">
alert(document.getElementById("info").innerHTML);
</script>
</body>
</html>
die kleine süße funktion zeige_nodes() sollte mir ja jetz eigentlich alle nodes als tabelle aufschreiben, macht sie aber nicht, sie geht alle nodes mit z=0 ab und bricht dann ab ..... und ich weiß nich warum ;(
sprich folgendes kommt bei raus:
Anzahl: 2, z: 0 TD
Anzahl: 1, z: 0 SPAN
Anzahl: 1, z: 0 #text
und nu? bin echt am grübeln aber ich komm nicht drauf, hoffe jemand hat eine lösung dafür .....
dankebar für jede hilfe - der mech
Hallo,
function zeige_nodes(obj)
{
instanz++;
anzahl=obj.childNodes.length;
for(z=0;z<anzahl;z++)
{
document.write("<tr>");
document.writeln("<td>Anzahl: " + String(anzahl) + ", z: " + String(z) + "</td>");
for(i=0;i<instanz;i++)
{
document.writeln("<td> </td>");
}
document.write("<td colspan=30>" + String(obj.childNodes[z].nodeName) + "</td>");
document.writeln("</tr>");
if(obj.childNodes[z].hasChildNodes())
{
zeige_nodes(obj.childNodes[z]);
}
}
instanz--;
}
Deine Variablen "anzahl" und "z" sind im gesammten Kontext gültig und werden damit mit jedem Aufruf von "zeigeNodes" überschreiben.
Vielleicht liegts daran?
Ein
var anzahl = 0;
var z = 0;
am Anfang Deiner zeigeNodes-Funktion löst vielleicht Dein Problem
(damit bekommt jeder Aufruf von "zeigeNodes" sein eigenes z und anzahl).
Viele Grüße,
Jörg
moins
Deine Variablen "anzahl" und "z" sind im gesammten Kontext gültig und werden damit mit jedem Aufruf von "zeigeNodes" überschreiben.
Vielleicht liegts daran?Ein
var anzahl = 0;
var z = 0;am Anfang Deiner zeigeNodes-Funktion löst vielleicht Dein Problem
(damit bekommt jeder Aufruf von "zeigeNodes" sein eigenes z und anzahl).Viele Grüße,
Jörg
ähm das versteh ich nicht, also ich habs jetz so gemacht und es scheint zu funktionieren, aber wieso sind, nur weil ich die vorher in der funktion nicht extra mit var deklariere, diese dann sozusagen global und nicht lokal, wie sie es eigentlich sein sollten??
aber danke erstmal, hilft mir ungemein weiter
Hallo,
ähm das versteh ich nicht, also ich habs jetz so gemacht und es scheint zu funktionieren, aber wieso sind, nur weil ich die vorher in der funktion nicht extra mit var deklariere, diese dann sozusagen global und nicht lokal, wie sie es eigentlich sein sollten??
suche einmal im Internet nach "scope var javascript". Da findest Du u.a. dies: http://www.mredkj.com/tutorials/reference_js_intro.html#scope
und das: http://jszen.blogspot.com/2005/04/variable-scoping-gotchas.html.
Das sollte einiges klären.
Ciao,
Andreas
Hallo,
ähm das versteh ich nicht, also ich habs jetz so gemacht und es scheint zu funktionieren, aber wieso sind, nur weil ich die vorher in der funktion nicht extra mit var deklariere, diese dann sozusagen global und nicht lokal, wie sie es eigentlich sein sollten??
Wie mit der Gültigkeit von nicht deklarierten variablen umgegangen wird, hängt von der verwendeten Programmiersprache ab:
PERL und JavaScript wandern, wenn sie eine Variable finden, die nicht deklariert ist, immer weiter nach oben im Gültigkeitsbereich - wenn sie ganz oben (im "Globalen") angekommen sind, und immer noch keine Variable finden, die so heisst, nehmen sie an, die gefundene Variable habe globale Gültigkeit.
Abhilfe kannst Du schaffen, in dem du irgendwo die Variable definierst (in JavaScript mit "var", in Perl z.b. mit "my")
PHP hingegen machts z.b. umgekehrt,
da ist erstmal alles lokal, wenn man die globale Variablen nicht mit "global" o.ä. in eine Funktion importiert.
Am besten, man deklariert jede Variable, die man benutzt. In klassischen Programmiersprachen (C, Java, Pascal usw.) muss man das ja ohnehin, und in Skriptsprachen wie Perl, javaScript und PHP hilft es, missverständnisse zwischen Programmierer und Skript-Interpreter
zu vermeiden.
Viele Grüße,
Jörg