Problem mit setTimeout() bei Opera 7.11
sven
- javascript
0 Sven Rautenberg0 sven
n'abend
Auf meiner Seite läuft eine kleine Uhr.
Ich ermittle zuerst die aktuelle Zeit auf dem Server mit PHP und übergebe die Werte an JS.
Folgende Funktion soll die Zeit sekündlich aktualisieren.
function sekZaehler(){
newTimestamp = newTimestamp + 1000;
setTimeout("sekZaehler()",1000)
}
Im IE (5.5) und NS(7) funktioniert das auch wunderbar.
Bei Opera (7.11) zählt die Uhr ungenau, sprich es wird nicht sekündlich sondern nur alle 2-3 Sekunden aktualisiert.
Dann zwar auch um mehr als eine sek, so dass es so aussieht, als würde die Uhr noch richtig laufen aber eben nur jede 2 Sekunden aktualisieren, wenn man sie Seite dann allerdings ein paar min offen lässt, kann man schon einen deutlichen Unterschied feststellen.
Hat jemand eine Erklärung und/oder weiß Abhilfe??
Vielen Dank
Sven
Moin!
Folgende Funktion soll die Zeit sekündlich aktualisieren.
function sekZaehler(){
newTimestamp = newTimestamp + 1000;
setTimeout("sekZaehler()",1000)
}Im IE (5.5) und NS(7) funktioniert das auch wunderbar.
Bei Opera (7.11) zählt die Uhr ungenau, sprich es wird nicht sekündlich sondern nur alle 2-3 Sekunden aktualisiert.
Dann zwar auch um mehr als eine sek, so dass es so aussieht, als würde die Uhr noch richtig laufen aber eben nur jede 2 Sekunden aktualisieren, wenn man sie Seite dann allerdings ein paar min offen lässt, kann man schon einen deutlichen Unterschied feststellen.
Du solltest dich bei Javascript nicht auf den zeitlich korrekten Ablauf verlassen. Die Ausführungsgeschwindigkeit von Javascript ist in den einzelnen Browsern höchst unterschiedlich.
Dein Programm verläßt sich darauf, das zwischen dem Ablauf des Timeouts und dem Neustart des Timeouts genau 0,000 Millisekunden Zeit vergehen - das Javascript also praktisch in Nullzeit ausgeführt wird. Das ist natürlich nicht so. Funktionsaufrufe benötigen Zeit. Folglich geht deine selbstgebaute Uhr auf Dauer immer falscher. Bei Opera kommt dies nur am deutlichsten zum Vorschein.
Der Gedanke, die Serveruhrzeit als Maßstab zu nehmen, ist dabei ja grundsätzlich nicht verkehrt. Nutze aber ebenso die Tatsache, dass jeder Rechner über eine gut funktionierende, zumindest die Sekunden zuverlässig zählende Uhr verfügt. Beim Seitenladen weißt du durch PHP die Serverzeit und stellst mit Javascript die Differenz zur Client-Zeit fest. Jede Sekunde gibst du dann die Client-Zeit, korrigiert um die Server-Differenz, aus - und schon mußt du dir um unregelmäßige Zeitaufrufe keine Gedanken mehr machen.
Das Delay bei der Anzeige im Opera dürfte übrigens einfach daher rühren, dass er nicht 100% regelmäßig die Anzeige aktualisiert. Wenngleich ich sowas bei Opera noch nicht wirklich erlebt habe, so dürfte die Funktion dennoch ordnungsgemäß aufgerufen werden - denn ansonsten würde die Uhr alle zwei Sekunden nur um eine Sekunde hochgezählt werden.
- Sven Rautenberg
Hallo Sven :)
Du solltest dich bei Javascript nicht auf den zeitlich korrekten Ablauf verlassen. Die Ausführungsgeschwindigkeit von Javascript ist in den einzelnen Browsern höchst unterschiedlich.
ok
Dein Programm verläßt sich darauf, das zwischen dem Ablauf des Timeouts und dem Neustart des Timeouts genau 0,000 Millisekunden Zeit vergehen - das Javascript also praktisch in Nullzeit ausgeführt wird. Das ist natürlich nicht so. Funktionsaufrufe benötigen Zeit. Folglich geht deine selbstgebaute Uhr auf Dauer immer falscher. Bei Opera kommt dies nur am deutlichsten zum Vorschein.
ok
Der Gedanke, die Serveruhrzeit als Maßstab zu nehmen, ist dabei ja grundsätzlich nicht verkehrt. Nutze aber ebenso die Tatsache, dass jeder Rechner über eine gut funktionierende, zumindest die Sekunden zuverlässig zählende Uhr verfügt. Beim Seitenladen weißt du durch PHP die Serverzeit und stellst mit Javascript die Differenz zur Client-Zeit fest. Jede Sekunde gibst du dann die Client-Zeit, korrigiert um die Server-Differenz, aus - und schon mußt du dir um unregelmäßige Zeitaufrufe keine Gedanken mehr machen.
Wie ich per JS die Clientzeit auslesen kann weiß ich zwar nicht, krieg ich aber wohl rel. schnell raus.
Aber:
Wie soll des sekundenmäßige Abgleichen funtionieren ?
Oder gibt es bereits eine JS interne Funktion, die jedes Sekunde die Zeit ausgibt ?
Weil wenn nicht hab ich ja das gleiche Problem, das sich meine Funktion alle 1000ms selbst aufrufen soll und ich steh wieder am Anfang :)
Könntest Du mir also nochmal folgenden Satz genauer erklären:
Jede Sekunde gibst du dann die Client-Zeit, korrigiert um die Server-Differenz, aus [...]
Danke und gute Nacht!
Sven
Hi,
Könntest Du mir also nochmal folgenden Satz genauer erklären:
Jede Sekunde gibst du dann die Client-Zeit, korrigiert um die Server-Differenz, aus [...]
Du schickst dir Server zeit an den CLient und vergleichst diese mit der Clientzeit (da die Clientzeit u.U. falsch ist). Diese Differenz merkst du dir.
dann bastelst du dir ne Funktion, die immer die aktuelle Clientzeit holt. darauf addierst du die Differenz und gibst die richtige Zeit sekündlich aus. (auch indem du die Funktion sekündlich neu aufrufst)
Christian
Hallo
Du schickst dir Server zeit an den CLient und vergleichst diese mit der Clientzeit (da die Clientzeit u.U. falsch ist). Diese Differenz merkst du dir.
dann bastelst du dir ne Funktion, die immer die aktuelle Clientzeit holt. darauf addierst du die Differenz und gibst die richtige Zeit sekündlich aus. (auch indem du die Funktion sekündlich neu aufrufst)
öhm, und wo ist da jetzt der Unterschied im Bezug auf die Ausführgeschwindigkeit eines Skripts ?
[sven rautenberg]
Dein Programm verläßt sich darauf, das zwischen dem Ablauf des Timeouts und dem Neustart des Timeouts genau 0,000 Millisekunden Zeit vergehen - das Javascript also praktisch in Nullzeit ausgeführt wird. Das ist natürlich nicht so. Funktionsaufrufe benötigen Zeit. Folglich geht deine selbstgebaute Uhr auf Dauer immer falscher.
[/s. r.]
Dieses Problem ist doch mit oben beschriebener Methode nicht behoben !
Oder seh ich da was falsch ?
Danke und Gruß an alle !
Sven
Hi,
Dieses Problem ist doch mit oben beschriebener Methode nicht behoben !
Ich dachte schon! In der Funktion soll doch JEDES Mal das aktuelle Datum geholt werden (client natürlich). Und dieses sollte doch nichts mit der Ausführgeschwindigkeit des Skripts zu tun haben, sondern mit der Systemzeit.
Auf dieses Datum/Zeit soll dann die Differenz drauf...
Christian
ok, jetzt hab ichs verstanden :-)
Herzlichen Dank und schönen Sonntag
cu
Sven
Moin!
Wie ich per JS die Clientzeit auslesen kann weiß ich zwar nicht, krieg ich aber wohl rel. schnell raus.
Du suchst das Javascript-Objekt "Date" http://selfhtml.teamone.de/javascript/objekte/date.htm.
Es bietet sich an, mit getTime() die Sekundenzahl zu ermitteln - einmal vom Client, und einmal vom Server. Der Server kann entweder die Sekunden selbst ermitteln, oder aber seine Zeit in Javascript-Code umsetzen, welcher ein eigenes Date-Objekt erstellt und daraus dann die Sekunden ermittelt.
Wie man dann die Differenz ermittelt, ist dir sicherlich klar.
Aber:
Wie soll des sekundenmäßige Abgleichen funtionieren ?
Oder gibt es bereits eine JS interne Funktion, die jedes Sekunde die Zeit ausgibt ?
Weil wenn nicht hab ich ja das gleiche Problem, das sich meine Funktion alle 1000ms selbst aufrufen soll und ich steh wieder am Anfang :)
Für die korrekte Zeitausgabe reicht es ja, wenn _ungefähr_ alle Sekunde die Funktion aufgerufen wird und dann die _genaue_ (weil durch den Computer und nicht durch dein Javascript weitergezählte) Zeit ausgibt.
Wenn das nicht _exakt_ jede Sekunde geschieht, ist das kein Problem. Wenn das Skript länger als eine Sekunde braucht, wird irgendwann einmal um zwei statt eine Sekunde weitergezählt - und außerdem ticken die Sekunden nicht 100% exakt im Sekundentakt hoch. Dürfte also herzlich egal sein. Und wenn das Skript weniger als eine Sekunde benötigt, dann wird irgendwann einmal _nicht_ eine Sekunde hochgezählt.
Summa summarum: Du kriegst eine wirklich 100% exakte Uhr ohnehin nicht dargestellt - aber wenn du die eingebaute Uhr des Computer benutzt, kriegst du wenigstens die richtige Zeit in unregelmäßigen Abständen ausgegeben.
Ach ja: Das Date-Objekt hilft dir natürlich auch, um die Sekundenzahl wieder in eine darstellbare Zeit zu wandeln. Siehe setTime() und das Beispiel dort.
- Sven Rautenberg
Hi
[...] wenigstens die richtige Zeit in unregelmäßigen Abständen [...]
jetzt hab ichs verstanden :-)
Vielen Dank und einen schönen Sonntag !!
cu
Sven
hi,
Summa summarum: Du kriegst eine wirklich 100% exakte Uhr ohnehin nicht dargestellt - aber wenn du die eingebaute Uhr des Computer benutzt, kriegst du wenigstens die richtige Zeit in unregelmäßigen Abständen ausgegeben.
und wenn du stattdessen gleich auf die in der taskleiste o.ä. angezeigte uhrzeit deines rechners schaust, kannst du den platz auf deiner seite auch für was sinnvoll(er)es verwenden.
gruss,
wahsaga