Gustl: heute jemand hier? funktion starten in einer schleife ...

hi, wie starte ich eigentlich eine funktion mehrmals in einer schleife, also einfach so ohne event?

funktion sonntagskuchen(zahl) { bla.kuchen = zahl; }

for ($i .. $i++) { starte sonntagskuchen($i); }

  • Gustl
  1. Lieber Gustl,

    ich verstehe Dein Problem nicht.

    funktion sonntagskuchen(zahl) { bla.kuchen = zahl; }

    Schreiben wir das einmal korrekt:

    function sonntagskuchen (zahl) { bla.kuchen = zahl; }

    Die Methode "sonntagskuchen" ist nun definiert. Sie ist als window.sonntagskuchen ansprechbar (man kann "window." weglassen).

    for ($i .. $i++) { starte sonntagskuchen($i); }

    Das sieht eher nach PHP aus. Lassen wir das Dollarzeichen lieber weg:

    for (var i = 0; i < 10; i++) { sonntagskuchen(i); }

    In der Schleife wird bei jedem Durchlauf die Methode sonntagskuchen bemüht. Dabei wird "window.bla.kuchen" der momentane Wert der Zählvariablen i zugewiesen ("bla" ist dasselbe wie "window.bla", die Art wie "globale" Variablen in JavaScript gehandhabt werden). Solltest Du versäumt haben window.bla zu definieren, dann bekommst Du natürlich Fehlermeldungen.

    Nochmal: Wo ist Dein Problem?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,

      Nochmal: Wo ist Dein Problem?

      momentan in einer Endlos-Rekursion ohne Abbruchbedingung.

      Ciao,
       Martin

      --
      F: Kennt jemand ein Automobil-Märchen?
      A: Radkäppchen und der böse Golf.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. ich habs hingebogen, aus codeschnipseln die ich gefunden habe etc. in der schleife kann ich nun nüsse knacken oder sonstwas, halt sachen machen die lang dauern und ich hab ne rückmeldung. durch das 100-malige schreiben der datei ist das script so langsam, dass man es testen kann :-) wenn $start sehr gross ist, würde ich die datei nicht bei jedem durchlauf schreiben, sondern vielleicht nur alle 20 mal oder so. das würde auch reichen.

        wer kann denn bitte mit fachmännischem auge da nochmal hinkucken?

        ############## HTML ################

        <!DOCTYPE html><html><head><title>Prozesstest</title>  
        <style type="text/css">  
          body { background-color: #FFFFFF; font-family: Verdana,Arial,sans-serif; font-size: small; color: #000000 }  
          #aussen { border: 1px solid #000000; height: 16px; display: block; background-color: #DDDDDD }  
          #innen { background-color: #00FF00; border-right: 1px solid #000000; height: 16px }  
        </style>  
        </head><body>  
          
          <div id="fortschritt" style="display: none; width: 400px; margin: auto">  
            <fieldset>  
              <legend>Fortschritt in Echtzeit</legend>  
              <div id="aussen">  
                <div id="innen" style="width: 0%"></div>  
              </div>  
              Stueck: <span id="stueck">0</span>/<span id="alle">0</span> (<span id="prozent">0</span>%)  
            </fieldset>  
          </div>  
          
          <div id="machmal" style="display: block; width: 400px; margin: auto">  
          
          <fieldset>  
            <legend>Prozess starten</legend>  
          
            <form action="/cgi-bin/test.cgi" method="post" onSubmit="return start()" id="formular">  
            <input type="hidden" name="do" value="los"><input type="hidden" name="sessid" id="sessid">  
          
            <table border="0" cellspacing="0" cellpadding="2"><tr><td align="center">  
              <select name="startwert">  
                <option value="250">Mach es 250 mal</option>  
                <option value="500">Mach es 500 mal</option>  
                <option value="1000">Mach es 1000 mal</option>  
              </select>  
        	  <input type="submit" value="Starten">  
            </td></tr></table>  
        	</form>  
          </fieldset>  
          
          </div>  
          
          
        [code lang=javascript]<script type="text/javascript">  
          
        function $(o) { return document.getElementById(o); }  
          
        function init() {  
                var hex = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" ]; var ses = "";  
                for (var i = 0; i < 8; i++) { var rnd = Math.floor(Math.random()*16); ses += hex[rnd]; }  
                $("sessid").value = ses; $("formular").action += "?" + ses; } window.onload = init;  
          
        function start() {  
                $("machmal").style.display = "none";  
                $("fortschritt").style.display = "block";  
                setTimeout("ping()", 500); return true; }  
          
        function ping() {  
                var ajax = new XMLHttpRequest();  
                ajax.onreadystatechange = function () { if (ajax.readyState == 4) { parse(ajax.responseText); } };  
                ajax.open("GET", "../cgi-bin/test.cgi?do=ping&sessid=" + $("sessid").value + "&rand=" + Math.floor(Math.random()*99999), true);  
                ajax.send(null); }  
          
        function parse(txt) {  
        		var parts = txt.split(":");  
                if (parts.length == 3) {  
                        $("stueck").innerHTML = parts[0];  
                        $("alle").innerHTML = parts[1];  
                        $("prozent").innerHTML = parts[2];  
                        $("innen").style.width = parts[2] + "%";  
                }  
                setTimeout("ping()", 500); }  
        		  
        </script>
        

        </body></html>[/code]

        ############## CGI ################

        #!/usr/bin/perl -w  
          
        use strict;  
        use warnings;  
        use CGI;  
        use CGI::Carp "fatalsToBrowser";  
          
        my $q 	= 	new CGI;  
          
        print "Content-Type: text/html\n\n";  
          
        my $action 		= $q->param("do") 			|| "kein_wert";  
        my $start 		= $q->param("startwert") 	|| "kein_wert";  
          
        if ($action eq "los")  
        {  
            my $sessid 	= 	$q->param("sessid");  
        	$sessid 	=~ 	s/[^A-F0-9]//g;  
        	my $prozent;  
          
            for (my $i=0; $i <= $start; $i++)  
        	{  
              $prozent	= 	int ( ($i / $start ) * 100);  
        	  open 	(SES, 	">../sess/$sessid.session");  
        	  print SES 	"$i:$start:$prozent";  
        	  close (SES);  
        	}  
          
            unlink	("../sess/$sessid.session");  
        	print 	"Fertig <a href=\"../test.htm\">Nochmal</a>";  
        }  
          elsif ($action eq "ping")  
        {  
          my $sessid 	= 	$q->param("sessid");  
          $sessid 		=~ 	s/[^A-F0-9]//g;  
          
          if (-f 		"../sess/$sessid.session")  
          {  
            open (READ, 	"../sess/$sessid.session");  
        	my $data 		= <READ>;  
        	close 			(READ);  
        	print $data;  
          }  
          else  
          {  
            print "sessiondatei nicht gefunden";  
          }  
        }  
          else  
        {  
          print "falscher wert action";  
        }
        
    2. Lieber Gustl, ich verstehe Dein Problem nicht.

      lieber felix, ich auch nicht :-)

      die 'zahl' bekomme ich aus einer perl-schleife. $prozent.

      ...

      <style type=\"text/css\">  
        div.aussen { border:1px solid #000; background-color:white; width:200px; height:28px; padding:1px; }  
        div.innen { background-color:green; height:28px; width:1%; }  
      </style>
      

      ...

      <div class=\"aussen\"><div id=\"1\" class=\"innen\"></div></div>

      <script type=\"text/javascript\"> function prozent(zahl) { document.getElementById(\"1\").style.width = zahl; } </script>

      ...

      foreach (my $i=0; $i <= 111; $i++)  
      {	  
        my $prozent = int( ( $i / 111 ) * 100);  
        
        so: prozent($prozent);  
        
        oder so: print"<script type=\"javascript\">prozent($prozent);</script>";  
        
      }
      

      OK. ich glaube zwar kapiert zu haben dass das ganze eigentlich nicht funktionieren kann, aber ich weiss auch nicht viel. im grunde müsste es gehen, und zwar wenn ich die funktion ohne event starten kann bzw. halt einfach den wert $zahl während der laufenden schleife irgendwie an prozent übergeben kann.

      der wert der schleife ändert sich ja, also muss ich irgendwas in die ausgabe drucken um die funktion anzusprechen. und da liegt der haken, oder?

      habs schon in die ausgabe innerhalb der schleife gedruckt, aber das ist ja auch nix. dann steht da 100 mal

      <script type="javascript">prozent(1);</script>  
      <script type="javascript">prozent(2);</script>
      

      im quelltext. für einen einmaligen ausdruck würde das gewiss so gehen. aber so nicht, prozent weiss ja nicht mehr was nun richtig ist, 1 oder 2 ... oder 85.

      das eigentliche problem ist folgendes: ich sende in dieser schleife infomails an ehemalige teilnehmer eines radrennens, um sie erneut einzuladen. und das kann dauern bis die alle durchgerattert sind. indes sollte ich wissen, wieviel prozent der mails schon raus sind.

      ich weiß die gesamtzahl der mails die verschickt werden und ich weiß wieviel die schleife schon verschickt hat.

      heute muss ich es nicht mehr lösen, aber morgen :-)

      wünsche allen noch einen schönen sonntag abend.

      • Gustl
      1. Lieber Gustl,

        die 'zahl' bekomme ich aus einer perl-schleife. $prozent.

        Du vermischst serverseitige Logik (Perl) mit clientseitiger (JavaScript). Deswegen postest Du auch serverseitigen Code, obwohl Dein Problem ein clientseitiges ist.

        Um eine vernünftige Lösung zu Deinem Problem zu schaffen, solltest Du strikt(!!) zwischen diesen beiden Ebenen trennen:

        1.) Perl erzeugt _irgendeinen_ Code.
        2.) JS nutzt das vorhandene (HTML-)Dokument.

        <div id=\"1\" class=\"innen\"></div>

        Eine ID muss mit einem Buchstaben beginnen. Das ist Vorgabe der Spezifikation.

        <script type=\"text/javascript\"> function prozent(zahl) { document.getElementById(\"1\").style.width = zahl; } </script>

        Soll das ein Fortschrittsbalken werden?

        OK. ich glaube zwar kapiert zu haben dass das ganze eigentlich nicht funktionieren kann, aber ich weiss auch nicht viel. im grunde müsste es gehen, und zwar wenn ich die funktion ohne event starten kann bzw. halt einfach den wert $zahl während der laufenden schleife irgendwie an prozent übergeben kann.

        Was _genau_ willst Du erreichen?? Es scheint so auszusehen, als ob Du einen Fortschrittsbalken anzeigen willst, der den Fortschritt eines serverseitigen Prozesses im Browser abbilden soll. Was Du aber nicht berücksichtigst ist, dass ein fertiges Dokument im Browser als Ergebnis eines serverseitigen Prozesses ankommt. Erst wenn Perl fertig ist, wird der Browser anfangen, das Dokument darzustellen. Daher ist Dein Ansatz von technischer Seite her im Konzept problematisch.

        heute muss ich es nicht mehr lösen, aber morgen :-)

        Was _genau_ musst Du lösen?

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. guten morgen felix,

          »»Daher ist Dein Ansatz von technischer Seite her im Konzept problematisch.

          so wie ich das wollte undurchführbar. ich hab mich da in was unmögliches verrant. passiert mir wenn ich müde bin und ne lösung übers knie brechen will.

          im grunde muss ich nur den wert zahl während das script läuft z.b. alle halbe sekunde an prozent übergeben und damit style.width akutalisieren. aber das geht nicht, aus den gründen die du schon genannt hast.

          also doch eine session.datei mitschreiben und die über einen ping abfragen. wieso muss das immer so kompliziert und über 5000 ecken sein ... wobei ich mir nicht sicher bin ob ich die datei überhaupt brauche weil ich noch nicht kapiert habe wie das ajax zeugs funktioniert und wie die daten in mein javascript kommen.

          • Gustl
          1. Lieber Gustl,

            ich hab mich da in was unmögliches verrant.

            das ist doch ein ausgezeichneter Fortschritt! Jetzt kann man weiter schauen.

            also doch eine session.datei mitschreiben und die über einen ping abfragen.

            Im Grunde schreibst Du eine Datei in ein spezielles Verzeichnis, ja. Nach Ablauf des Scripts kann dann die Datei wieder gelöscht werden. Ob es dafür eine Session benötigt - kann man diskutieren.

            wieso muss das immer so kompliziert und über 5000 ecken sein ...

            Das hat dieses HTTP so an sich, da es ein zustandsloses Protokoll ist. Je einfacher es für den Client sein soll, desto komplizierter wird es für den Server.

            wobei ich mir nicht sicher bin ob ich die datei überhaupt brauche weil ich noch nicht kapiert habe wie das ajax zeugs funktioniert und wie die daten in mein javascript kommen.

            Das kann AJax sein, muss es aber nicht. Ajax (alias XMLHttpRequest-Objekt) ist insofern vernünftig, als dass Du sofort den Inhalt einer Datei "im Speicher" hast, ohne sie als neues <script>-Element einbinden zu müssen.

            Also braucht Dein JavaScript nur den Namen der Datei zu kennen, die es in gewissen Abständen immer wieder vom Server lädt, während Dein Perl-Script den Dateiinhalt seinerseits immer wieder aktualisiert.

            Der Dateiinhalt könnte so aussehen: 0.25

            Mit dem XMLHttpRequest-Objekt kannst Du diesen Code als responseText auswerten:

            var width = String.concat(  
                Math.floor(Math.abs(  
                    mein_response_text  
                ) * 100),  
                "%"  
            );
            

            Den erhaltenen String kannst Du dann als (CSS-)Wert an die width-Eigenschaft des entsprechenden Styleobjektes weitergeben.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. [latex]Mae  govannen![/latex]

              Ajax (alias XMLHttpRequest-Objekt)

              Nein. "Ajax" (wenn man diesen dämlichen Bezeichner [ich hasse ihn] schon verwenden will) kann immer nur eine Untermenge von XMLHttpRequest (alias XHR) sein, kein Alias. Oder hältst du - beispielsweise - synchrones „Ajax“ für möglich? Nein? Eben. ;)

              Stur lächeln und winken, Männer!
              Kai

              --
              I am Pentium of Borg. Division is futile. You will be approximated.
              SelfHTML-Forum-Stylesheet