MichaelS: Script Handler

Guten Tag zusammen,

ich habe ein mittelschweres Problem :

Ich nutze ein einfaches CountdownScript zum zählen von Sekunden.
Diese sieht wie folgt aus:

function leadzero(intNbr) {
    return (intNbr<10) ? '0'+ intNbr : intNbr;
}
function cntdown(sec,target,cmd) {
 try {
  if (  
   cntdown.arguments.length >= 2 &&  
   document.getElementById  
  ) {  
   if (sec >= 0) {  
    h = Math.floor(sec / 3600);  
    m = Math.floor((sec % 3600) / 60);  
    s = sec % 60;  
  
    document.getElementById(target).firstChild.data =  
     leadzero(h) + ':' +  
     leadzero(m) + ':' +  
     leadzero(s);  
  
    setTimeout('cntdown(' + (sec-1) + ',"' + target + '","' + cmd + '")',999);  
   } else {  
    eval(cmd);  
   }  
  }  
 } catch(e) {}  
}  
  
Aufgerufen wird es dann über:  
  
<body class="game" onload="javascript:cntdown(100,'cnt','Abgeschlossen')">  
  
Angezeigt wird es dann natürlich so:  
<table>  
<tr><td><span id=\"cnt$i\">.</span></td></tr>  
</table>  
  
So und nun zum eigentlichen Problem .....  
  
Ich muss dieses Script im Prinzip unendliche male aufrufen können.  
Als Beispiel ne kleine for Schleife mit 100 aufrufen:  
  
<table>  
<?php  
for($i=0;$i<100;$i++)  
 {  
  echo "<tr><td><span id=\"cnt$i\">.</span></td></tr>";  
 }  
  
?>  
  
Warum und wieso is ja von Prinzip her egal.

Das Problem ist nun, das ich auf einer Tabelle keinen Eventhandler anwenden kann. Ein Aufruf des Countdowns also nicht möglich ist.

Hat jemand einen Tip, wie man das Realisieren könnte ?

Vielen Dank MichaelS
  1. Nachtrag !!

    EIngefallen wäre mir diese Lösung:

    <table>
    <?php
    for($i=0;$i<10;$i++)
     {
      echo "<tr><td><span id="cnt$i">.</span></td></tr>";
      echo "<script language="Javascript">cntdown(100,'cnt$i','Abgeschlossen')</script>";
     }
    ?>
    </table>

    Denke aber nicht das eine sehr performante Lösung ist ....

    Gruß MichaelS.

    1. Nochmal Update ....

      So sieht das Script nun aus, nach einwenig Spielerei. Problem nun ist, das er sich absolut Aufhängt -.-

      <script type="text/javascript">
      function leadzero(intNbr) {
          return (intNbr<10) ? '0'+ intNbr : intNbr;
      }
      function cntdown() {
       zeit = new Array("0", "11", "22", "33", "44", "55", "66", "77", "88", "99");
       target = new Array("cnt0", "cnt1", "cnt2", "cnt3", "cnt4", "cnt5", "cnt6", "cnt7", "cnt8", "cnt9");
       var x = 10;
       var ID = "";
       var sec = 0;
       for(i=0;i<=x;i++)
        {
         ID = target[i];
         sec = zeit[i];
        if (sec >= 0)
        {
         h = Math.floor(sec / 3600);
         m = Math.floor((sec % 3600) / 60);
         s = sec % 60;
         document.getElementById(ID).firstChild.data =
         leadzero(h) + ':' +
         leadzero(m) + ':' +
         leadzero(s);
         setTimeout('cntdown(' + (sec-1) + ',"' + ID + '")',999);
        }
        else
        {
         document.getElementById(ID).innerHTML = "beendet";
        }
        }
          }
      </script>

      Meiner Meinung nach, liegt das Problem in der if-Schleife und am Ende des Scripts. Nun bin ich aber wirklich am Ende meiner Weisheit angelangt und flehe um Hilfe !!

      1. zeit = new Array("0", "11", "22", "33", "44", "55", "66", "77", "88", "99");

        dieses Array hat 10 Elemente, der größte Index ist 9

        target = new Array("cnt0", "cnt1", "cnt2", "cnt3", "cnt4", "cnt5", "cnt6", "cnt7", "cnt8", "cnt9");

        dito

        var x = 10;

        soll wohl die Anzahl der o.g. Array-Elemente sein

        for(i=0;i<=x;i++)
          {
           ID = target[i];
           sec = zeit[i];

        hier geht deine Schleife bis zum Index 10, also dem nicht existenten 11ten Array-Element

        1. Stimmt Danke,

          hatte ich vergessen hier beim Post zu korrigieren vor dem Copy, im Script stimmte es bereits.

          Nichts destotrotz funktioniert es nicht .....

          Noch jemand vlt ne idee bitte ?

          Gruß MichaelS.

          1. Noch jemand vlt ne idee bitte ?

            ja, schon vor Stunden

            Struppi.

            1. Verzeihung Struppi,

              irgendwie macht mich dieses Forum hier konfus, zum einen finde ich nur sehr schwer meine eigenen Treads wieder, zum anderen habe ich deinen post erst heute gesehen.

              Entschuldige bitte

              Gruß MichaelS.

  2. Ich nutze ein einfaches CountdownScript zum zählen von Sekunden.
    Diese sieht wie folgt aus:

    Ich benutze eine Erweiterung und würde in deinem Fall zu einem Objekt raten.

    Die Erweiterung:

    Function.prototype.Timer = function(interval, calls, onend) {  
     // undefinierte Werte vermeiden  
     calls = calls || 0;  
     interval = interval  || 0;  
      
     if(interval < 0)  return alert('Interval ist kleiner Null!');  
      
     var count = 0;  
     var self = this;  
      
     var start_time = new Date();  
      
     // Die callBackfunktion wird während der Timer läuft aufgerufen  
     // gibt diese false zurück, wir der Timer beendet  
     var callBackFunction = function() {  return self(start_time, count)  };  
     // Funktion die am Ende aufgerufen wird.  
     var endFunction = function() {  if(onend) onend(start_time, count, calls) };  
      
     // Die Timerfunktion  
     var timerFunction =  function() {  
      count++;  
      if( ((!calls || count < calls) && false != callBackFunction()) )  
      {  
       window.setTimeout( timerFunction , interval);  
      }else {  
       endFunction();  
      }  
      ;  
     };  
     // Start!  
     return window.setTimeout( timerFunction , interval);  
    };
    

    Und so könnte dein Beispiel aussehen:

    <script type="text/javascript">  
    function leadzero(intNbr) {  
        return (intNbr<10) ? '0'+ intNbr : intNbr;  
    }  
    function cntdown(sec,target) {  
       var seconds = sec || 0;  
     var obj = document.getElementById(target).firstChild;  
     var cmd = cmd;  
     function countdown() {  
      if (seconds >= 0) {  
       var h = Math.floor(seconds / 3600);  
       var m = Math.floor((seconds % 3600) / 60);  
       var s = seconds % 60;  
       obj.data =  
       leadzero(h) + ':' +  
       leadzero(m) + ':' +  
       leadzero(s);  
       seconds--;  
      } else {  
       return false;  
      }  
     }  
     function fertig() {  
      alert('Fertig' + target);  
     }  
     countdown.Timer(100, 0, fertig);  
      
      
    }  
    window.onload = function() {  
    new cntdown(10, 'cnt1');  
    new cntdown(5, 'cnt2');  
    }  
    </script>
    
    <table>  
    <tr><td><span id="cnt1">.</span></td></tr>  
    <tr><td><span id="cnt2">.</span></td></tr>  
    </table>  
    
    

    Struppi.

    1. Hi vielen Dank für Deine verdammt hilfreiche Antwort !!

      kann ich

      function fertig() {
        alert('Fertig' + target);
       }

      durch

      function fertig() {
      document.getElementById(target).innerHTML = "Beendet";
      }

      ersetzen ?

      und

      }
       countdown.Timer(100, 0, fertig);
      }

      durch

      }
       countdown.Timer(sec, 0, fertig);
      }

      ???

      Das nächste ist, das ich das Script erst am Ende der Datei aufrufen kann, da zuvor PHP erst die notwendigen Daten bereitstellt.

      wichtig für mich wäre es also, wenn ich die sec, target in ein array schreiben könnte, um dann die countdowns am ende nach der php-script abarbeitung aufzurufen.

      Hast Du da auch einen Tipp dazu ?

      1. kann ich

        function fertig() {
          alert('Fertig' + target);
        }

        durch

        function fertig() {
        document.getElementById(target).innerHTML = "Beendet";
        }

        ersetzen ?

        Ja, aber sinnvoller wäre:
        function fertig() {
        obj.data = "Beendet";
        }

        Da es dann für jedes Objekt den entsprechenden Text ausgibt.

        und

        }
        countdown.Timer(100, 0, fertig);
        }

        durch

        }
        countdown.Timer(sec, 0, fertig);
        }

        Nein, aber da müßte statt einer 100 1000 stehen, da sec ja die Anzahl der Sekunden sein soll, oder?

        Das nächste ist, das ich das Script erst am Ende der Datei aufrufen kann, da zuvor PHP erst die notwendigen Daten bereitstellt.

        Das Skriptbeispiel wird onload, d.h. nach dem vollständigen laden der Datei aufgerufen. Das hat aber nichts mit PHP zu tun, sondern mit der Dauer der Übertragung über die Internetverbindung.

        wichtig für mich wäre es also, wenn ich die sec, target in ein array schreiben könnte, um dann die countdowns am ende nach der php-script abarbeitung aufzurufen.

        Du musst da nichts in ein Array schreiben, das sind Objekte.
        Jeder Aufruf:
        new cntdown(10, 'cnt1');
        new cntdown(5, 'cnt2');
        erzeugt ein neues Countdown Objekt mit einerm eigenen Target und eigenem Interval.
        Man könnte hier, um das ganze noch flexibler zu machen, natürlich auch eine Funktionsreferenz als Parameter übergeben, kommt halt drauf an was du willst.

        Struppi.

        1. Alles klarm gerafft ^^

          Vielen lieben Dank für Deine Mühen !
          Script eingebaut und läuft wie ne 1.

          Schön das es doch noch Leute gibt die einem Anfänger wirklich noch unter die Arme greifen !!

          Danke nochmal

          Gruß MichaelS.

  3. Hallo MichaelS,

    ich habe ein mittelschweres Problem :/

    Das Du wohl auch in Deinem alten Thread schildern könntest...

    Mit freundlichem Gruß
    Micha