klaus: rekursive funktion

Hi,
ich habe Probleme mit folgender Funktion:

function do_parsefiles(i) {
        var Anzahl = document.getElementById("name_list").childNodes.length - 1;
        var val = document.getElementById("name_list").childNodes[i].id;
     var res = document.getElementById("fileInfo");
     var info = document.getElementById("fileInfo").innerHTML;
        res.innerHTML = info + '<br>' + i + '/' + Anzahl + '-' + val;
     remote.parsefile(val);
     if(i < Anzahl) {

window.setTimeout( "do_parsefiles(i++)", 10 );
     }
     else
      res.innerHTML = i + '<br>FINISHED';
    }

Wenn ich diese Funktion mit einem do_parsefiles('0') aufrufe, bekomme ich immer am anfang 2x das 1. Childelement, bei einem Aufruf mit do_parsefiles(1), beginnt die Geschichte auch mit dem Element Nr 1, springt dann aber wieder 2x auf die Null.
Um Hilfe wäre ich sehr dankbar

Gruß Klaus

  1. Hi klaus,

    window.setTimeout( "do_parsefiles(i++)", 10 );

    Wie kommst du auf die Idee, dass hier das i bei i++ durch den wirklichen Wert von i ersetzt werden soll? Dann müssen ja das i in parsefiles auch ersetzt werden *g*

    Und wenn du nicht weißt wovon ich rede, dann würde ich dir empfehlen noch mal Zeichenketten-Verknüpfung nachzulesen - oder auf Englisch: string concatenation.

    Viele Grüße aus Kanada,
      ~ Dennis.

    1. Hallo,

      window.setTimeout( "do_parsefiles(i++)", 10 );

      mit anderen Worten,

        
      window.setTimeout( "do_parsefiles("+(i++)+")", 10 );  
      
      

      sollte es tun (ungeprüft)

      (In perl und php gehen solche Geschichten (Variablen in Strings erkennen), in javascript nicht)

      Gruß, Nils

      1. hi,

        window.setTimeout( "do_parsefiles("+(i++)+")", 10 );

        hmm hier geht denn alles mit i=0 durch :(

        1. Hallo,

          Hast Du das Script selbstgeschrieben?
          Ich hab keine Lust, ein geklautes Script zu korrigieren.
          Nur soviel:

          • Innerhtml ist grundsätzlich nicht die reine Lehre. Nutze das DOM.
          • remote.parsefile? In der Selfhtmlsuche finde ich da etwas unter "Datenanbindung (nur Microsoft)". Toll.
          • Letzter Absatz von Selfhtml -> Objektreferenz -> setTimeout() (Großbuchstaben von mir):

          "An setTimeout() gekoppelte Funktionsaufrufe können auch Parameter enthalten. Berücksichtigen Sie dabei, DASS LOKALE VARIABLE DANN NICHT MEHR ZUR VERFÜGUNG STEHEN. Eine Übergabe der Werte mittels Zeichenkettenverknüpfung ist jedoch jederzeit möglich."

          Diesen Satz verstehe ich von der Logik her auch nicht so recht. Aber vermutlich heißt das, das Du i global in deinem Script verfügbar machen solltest

          Gruß, Nils

          1. hi

            Hast Du das Script selbstgeschrieben?
            Ich hab keine Lust, ein geklautes Script zu korrigieren.

            Gäähn dann lass es, es ist selbst geschrieben ...
            Wenn ich scripte klauen würde, denn klau ich welche die auch funktionieren ;-)

            1. Hallo,

                
              <?xml version="1.0" encoding="utf-8" ?>  
              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
              <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de" dir="ltr">  
                
              <head>  
                 <meta http-equiv="content-type" content="text/html; charset=utf-8" />  
                 <meta http-equiv="Content-Script-Type" content="text/javascript" />  
                 <meta http-equiv="content-language" content="de" />  
                 <title>Test Rekursion</title>  
              </head>  
                
              <body>  
               <p id="countdown">10... </p>  
                 <script type="text/javascript">  
              
              ~~~~~~javascript
                
              /* <![CDATA[ */  
              x=9;  
              rek(x);  
              function rek(x) {  
                 meinText=document.createTextNode(x+"... ");  
                 document.getElementById("countdown").firstChild.appendData(meinText.nodeValue);  
                 if(x > 0) window.setTimeout("rek("+(x-1)+")",20);  
              }  
              /* ]]> */  
              
              ~~~~~~html
                
                 </script>  
              </body>  
                
              </html>  
              
              

              ist Standardkonform, funktioniert bei mir im Firefox. Für andere Browser keine Garantie :-)

              Gruß, Nils

              p.s. Weiß jemand, wieso die Javascript-Konsole im Firefox meckert, wenn ich das script auslagere????? Fehlermeldung: "document.getElementById("hallo") has no properties (...)"

              1. hi,

                p.s. Weiß jemand, wieso die Javascript-Konsole im Firefox meckert, wenn ich das script auslagere????? Fehlermeldung: "document.getElementById("hallo") has no properties (...)"

                Weil es durch das Auslagern vermutlich, wie so oft, zu früh zur Ausführung kommt - zu einem Zeitpunkt, wo noch kein Element mit der ID "hallo" im Dokumentenbaum existiert.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Hallo,

                  stimmt... scriptreferenz war im Kopf der Datei definiert... :-/

                  Danke und Gruß, Nils

              2. Hallo,

                Toll, Ich schreibe ihm sein Script und er ist weg, ohne was zu sagen :-/

                Gruß, Nils

                1. Hallo .nils.!

                  und er ist weg, ohne was zu sagen :-/

                  Tja, das ist das Schicksal eines jeden Helfers hier... Hier ist es zwar nicht allzuoft der Fall, aber im frz. Forum eher zu beobachten: Leute stellen eine Frage, lassen sich danach nie wieder blicken.

                  Nicht ärgern, trotzdem antworten. Im Archiv wird Dein Script zu finden sein, falls noch jemand ein ähnliches Problem hat!

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
                  1. Hallo,

                    Stimmt auch wieder, nichts ist umsonst...

                    Gruß, Nils

                2. Hi Nils,

                  Hallo,

                  Toll, Ich schreibe ihm sein Script und er ist weg, ohne was zu sagen :-/

                  hmm hattee geschrieben dass ichs hinbekommen hab, hast du denn wohl überlesen, trotzdem danke :)

          2. Hi

            Diesen Satz verstehe ich von der Logik her auch nicht so recht. Aber vermutlich heißt das, das Du i global in deinem Script verfügbar machen solltest

            <!--
            function go() {
             i=1;
             tes(i);
            }
            function tes(i) {
             var end = 10;
             var inh = document.getElementById('oo').innerHTML;
             document.getElementById('oo').innerHTML = inh + "<br>" + i;
             if(i <= end)
              window.setTimeout("tes(i++)",20);
            }
            go();
            -->

            in go ist nu i global gemacht ...
            geht aber trotzdem net ... Kommt das raus:
            1
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            ... wollt ich nur noch sagen

            Gruß Klaus

            1. Hi,

              function go() {
              i=1;

              Hier hast Du zwar ein globales i.

              function tes(i) {

              Aber das i innerhalb der Funktion ist der funktions-lokale Parameter, nicht die globale Variable.

              in go ist nu i global gemacht ...

              Ja, aber in tes nicht.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              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. Hi,

      Wie kommst du auf die Idee, dass hier das i bei i++ durch den wirklichen Wert von i ersetzt werden soll? Dann müssen ja das i in parsefiles auch ersetzt werden *g*

      Es klappt ja bei allen 114 Durchläufen, nur die ersten beiden werden mit i=0 ausgegeben, alle weiteren folgen dann mit i=1,i=2,u.s.w.
      Ich weiss etz net was das mit Zeichenketten-Verknüpfung zu tun haben soll ...
      Meine Annahme wäre ja, dass am anfang i als sting vorhanden ist, um das i++ durchzuführen muss es aber ein integer sein ...

      Gruß Klaus

  2. Hallo.

    Könntest Du mir einmal verraten, was Du eigentlich machen willst?

    res.innerHTML = info + '<br>' + i + '/' + Anzahl + '-' + val;
    Hier überschreibst Du den Inhalt jedesmal? Absicht? Oder sollte das eine Art Liste werden ala:
    res.innerHTML = res.innerHTML + info + '<br>' + i + '/' + Anzahl + '-' + val;

    remote.parsefile(val);
    Was wird hier eigentlich aufgerufen, ist das wichtig?

    window.setTimeout( "do_parsefiles(i++)", 10 );

    Wiso eigentlich so und nicht mit einer for- oder while-Schleife über den ChildNodes-Array?

    Viele Grüße

    Michael

    1. Hallo.

      Könntest Du mir einmal verraten, was Du eigentlich machen willst?

      Ich will eine Liste mit mp3 Daten auslesen, und per Ajax die Header dateien bekommen ... Die Liste hab ich schon, das Problemscript soll die Liste durchlaufen

      res.innerHTML = info + '<br>' + i + '/' + Anzahl + '-' + val;
      Hier überschreibst Du den Inhalt jedesmal? Absicht? Oder sollte das eine Art Liste werden ala:
      res.innerHTML = res.innerHTML + info + '<br>' + i + '/' + Anzahl + '-' + val;

      Das ist nur eine Kontrollausgabe

      remote.parsefile(val);

      Das ist die Ajax Funktion

      window.setTimeout( "do_parsefiles(i++)", 10 );
      Wiso eigentlich so und nicht mit einer for- oder while-Schleife über den ChildNodes-Array?

      Nicht über eine Schleife, denn dakann ich nichts auf den Bildschirm ausgeben, denn ich möchte jedesmal wenn icheines der mp3 - Files parse ausgeben welches gerade geparst wird ....

      Gruß Klaus

  3. Hi,
    habs gelöst ...

    zwar net grad elegant, aber es geht, .. habe nun ein feld angelegt, aus welchen ich mir i auslese, um 1 erhöhe und in das feld schreibe, bei jedem durchgang

    Gruß Klaus