JavaScript window.setTimeout zählt zu langsam

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
825
Hallo,

und zwar habe ich einen Countdown mit "window.setTimeout", das jede Sekunde eine Sekunde runterzählen soll, geschrieben.
Wenn ich die Seite ansehe, wie die Zeit herunter läuft, scheint alles ok zu sein. Aktualisiere ich die Seite nach ca. 5-10 Minuten, fehlen fast 30 Sekunden. Durch den Aufruf wird die Zeit via PHP in das Javascript geholt.

"clearInterval" brachte leider keine Lösung. Kann jemand helfen, gern auch Quelle?
 
Wird die Zeit denn auch im PHP-Backend verändert?

Kann es sein, dass der Server bzw. du, also dein Client unterschiedliche Zeiten gesetzt haben? (Wobei eine Differenz von 30s krass ist)

Zeig doch mal etwas Code :)
 
Code:
function countdown (cd_name, cd_time, cd_action)
	{
		var cd_orgTime	= cd_time < 0 ? 0 : cd_time;
		var cd_days		= 0;
		var cd_hours	= 0;
		var cd_minutes	= 0;
		var cd_seconds	= 0;
		var cd_result	= "";
			
		if (cd_orgTime > 0)
		{
			cd_days	= Math.floor(cd_time / 86400);
			cd_time	-= cd_days * 86400;
			
			cd_hours	= Math.floor(cd_time / 3600);
			cd_time		-= cd_hours * 3600;
			
			cd_minutes	= Math.floor(cd_time / 60);
			cd_seconds	= cd_time - cd_minutes * 60;
			
			// create strings
			var stringTD	= ":";
			var stringTH	= ":";
			var stringTM	= ":";
			var stringTS	= " ";
			
			var stringND	= cd_days + ":";
			var stringNH	= (cd_hours < 10 ? "0":"") + cd_hours;
			var stringNM	= (cd_minutes < 10 ? "0":"") + cd_minutes;
			var stringNS	= (cd_seconds < 10 ? "0":"") + cd_seconds;

			cd_result	= "&raquo; 0" + cd_hours + stringTH + stringNM + stringTM + stringNS + stringTS;

                        var timer;
			// refresh (1 sec)
                        clearTimeout(timer);
                        timer =	setTimeout("countdown('" + cd_name + "','" + (cd_orgTime - 1) + "', '" + cd_action + "')", 1000);
                        
		}
		else cd_result	= "&raquo; 00:00:00";
		
		// print result
		document.getElementById(cd_name).innerHTML	= cd_result;
	}
Befeuert wird sie durch das hier:
Code:
<script>countdown("countdown1", <?php echo $sdiff; ?>, "start");</script>
 
setTimeout und setInterval sind keine präzisen Zeitgeber. setTimeout(..., 1000) bedeutet "rufe die Funktion in frühestens 1000 Millisekunden auf".
Um genaue Zeitangaben zu machen kann man Date.now() etc. verwenden um die Systemzeit auszulesen und dann die verbleibende Zeit bzw. verstrichene Zeit ausreichen.
Also immer einen absoluten Zeitpunkt speichern, die aktuelle Systemzeit auslesen und mit der Differenz rechen.
setTimeout kann man dann einfach zum regelmäßigen aktualisieren verwenden bzw requestAnimationFrame(), damit wird eine Funktion jeden Frame aufgerufen (ca. 60 Hz) wenn man ganz genau sein will.
 
Zurück
Oben