Countdown hat Fehler ?!

PHP Killer

Grünschnabel
Hi,
ich habe mir einen Countdown geschrieben der eine Zahl jede Sekunde aus einem Tabellenfeld auslesen soll und diese dann weniger 1 Sekunde anzeigen soll.

Alles in allem funktionierts ja auch ohne Probleme, er zählt jede Sekunde eins runter.
Allerdings macht er manchmal eigenartige Sprünge die ich mir nicht erklären kann.
z.B.: 00:03:30 -> 00:03:59

:confused:

Code:
<script type="text/javascript">
<!--
	function vornull(zahl) 
	{
		return(zahl < 10) ? '0' + zahl.toString() : zahl;
 	}
	function reload()
	{
		for(var i=0;i < <?php echo $p; ?>;i++)
		{
			var zeit = document.getElementById("zeit_"+i).firstChild.data;
			zeit = zeit.split(":");
			var sec = (parseInt(zeit[0]) * 3600) + (parseInt(zeit[1]) * 60) + parseInt(zeit[2]);
			sec--;
			
			if (sec >= 0) 
			{
			  	  d = Math.floor(sec / 3600 / 24);
				  h = Math.floor(sec / 3600);
				  m = Math.floor((sec % 3600) / 60);
				  s = sec % 60;
	
				  document.getElementById("zeit_"+i).firstChild.data =
						  vornull(h) + ':' +
						  vornull(m) + ':' +
						  vornull(s);
	
			  } 
			  else
			  	document.getElementById("zeit_"+i).firstChild.data = " Abgeschlossen ";
		}
			  
	}
	setInterval("reload()",1000);
//-->
</script>

Kann mir da jemand weiterhelfen?
 
Ich seh in deinem Code keinen Fehler, der den beschriebenen Effekt hätte.

Aber ne andere Frage: Müsste es nicht so heißen
HTML:
d = Math.floor(sec / 86400);
  h = Math.floor(sec % 86400 / 3600);
  m = Math.floor(sec % 3600 / 60);
  s = sec % 60;
 
Zuletzt bearbeitet:
Wie kommst du darauf?

Also die eingelesenen Werte sind ablaufende Zeiten, z.B. 3 Minuten, in der Form: 00:03:00
die ich dann in sekunden umrechne, also in dem fall wären es 3*60 = 180s
 
Das geht gut, solange die Sekundenzahl keinen ganzen Tag ergibt.
Sobald dies der Fall ist, werden die Sekunden für den Tag nochmals bei den Stunden mitgezählt.... das war es, so meine ich, worauf con-f-use hinweisen wollte.
 
Okay, ich glaube wir sind uns einig, dass der einzige mathematische Unterschied zwischen unseren beiden Berechnungen in der Zeile
h = Math.floor(sec % 86400 / 3600);
bei mir und
h = Math.floor(sec / 3600);
bei dir besteht richtig?

Deine Zeile würde auch z.B. "25" Stunden erzeugen (bei "sec = 90000") während meine Zeile in diesem Fall "1" ausgibt, also nur Werte zwischen 1 und 23 zulässt, was ja wohl bei einem Countdown richtiger ist oder? Sonst hättest du z.B. sowas als Ausgabe "01:25:02:04" also einen Tag und 25 Stunden und das wäre ja falsch, weil gleichbedeutend mit zwei Tagen und einer Stunde.

Edit:
Sven war mal wieder schneller, sorry, aber ich hab's dafür confuser erklärt, ätsch! :-)

Siehst du da irgent einen Fehler der dieses "Springen" verursachen kann, Sven? Ansonsten würde ich das mal auf einem anderen Rechner testen, liegt bestimmt am Clientrechner.
 
Zuletzt bearbeitet:
Ok jetzt weiss ich was du meinst, danke für den Tip, nur hilft mir das bei meinem eigentlichen Problem leider nicht weiter

Allerdings macht er manchmal eigenartige Sprünge die ich mir nicht erklären kann.
z.B.: 00:03:30 -> 00:03:59

ich könnte mir vorstellen das er vielleicht die schleife zu oft durchläuft ?
 
Was hat denn die php-Variable $p für einen Wert oder mit anderen Worten: Wie kommst du auf $p?

Alternativ kannst du statt $p folgende Funktion benutzen um die Anzahl der Countdowns zu ermitteln:
HTML:
function countElement(strAttr,strTag,strExp) {
    	c=0;
    	for(i=0;i<document.getElementsByTagName(strTag.toUpperCase()).length;++i) {
    	    if(String(eval('document.getElementsByTagName(strTag)[i].'+strAttr)).match(new RegExp(strExp))) {
    			c++;
    		}
    	}
    	return c;
  }
Sie ermittelt die Anzahl der Elemente von der Art [TAG-Art z.B. div] die ein Attribut haben, das auf einen bestimmten regulären Ausdruck oder einen String passt. Die Schleife muss dann so lauten:
HTML:
for(var i=0;i < countElement('id','[TAG-ART z.B. div]',/^zeit_\d+\b/);i++)
Bei dir wird die Art des Tags wahrscheinlich <td> sein.
 
Zuletzt bearbeitet:
Das ganze ist eine Tabelle in der die Zeilen je nach der Anzahl an Daten(MySQL) hinzugefügt werden, sprich wenn 3 Datensätze mit der richtigen ID vorhanden sind erstellt mir das PHP Script je eine Zeile mit dem Inhalt des Datensatzes ( u.a. die Zeit ).

Lange Rede kurzer Sinn,
$p wird pro erstellter Zeile einmal incrementiert, d.h. 3 Datensätze -> $p = 3

die ID "zeile_"+i ist die id eines DIV bereichs
 
Zuletzt bearbeitet:
Also er zählt immer:

00:03:11
00:03:10
00:03:09 <-
00:02:59 <-
00:02:58

Bei jeder Minute, dass muss doch einen Grund haben.
 
Zuletzt bearbeitet:
Fehler gefunden!

Es liegt an dem parseInt(), das du benutzt - das interpretiert nämlich "09" als "0". Benutze statt dessen Number() oder lasse das vornull()en und alles wird gut.

Das ist der Grund, warum ich immer Number() benutze, wenn ich Zahlen will, hatte nur nicht dran gedacht.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück