Script Handler
MichaelS
- javascript
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
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.
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 !!
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
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.
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.
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.
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 ?
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.
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.
Hallo MichaelS,
ich habe ein mittelschweres Problem :/
Das Du wohl auch in Deinem alten Thread schildern könntest...
Mit freundlichem Gruß
Micha