SorgenkindMech: Rekursion

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>&nbsp;&nbsp;</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

  1. 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>&nbsp;&nbsp;</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

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

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

        --
        "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)
      2. 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