Timerproblem:document. bekommt keine Kontrolle bei "pause"
Stefan
- javascript
Hallo Leute,
ein immer wieder gerne genommenes Thema ist der nicht vorhandene Timer in JavaScript. Dazu gibt es im Forum workarounds. Einen davon wollte ich nutzen, um ein <div> schrittweise zu bewegen. Das Problem dabei ist, daß die document-Funktionen wohl keine Kontrolle bekommen, während die pause-Function läuft und die CPU in Beschlag hat. Hingegen wird der window.status sauber aktualisiert.
Kennt jemand das Problem oder sogar eine Erklärung dafür und gibt es eine Lösung???
Viele Grüße
Stefan
P.S. Hier das Beispiel:
<html>
<head>
<script>
function pause(zeit)
{
if(!zeit) return;
var starttime= (new Date).getTime();
while (starttime + zeit > (new Date).getTime() ){;}
}
function moveIt(){
left = 0;
for(i=1;i<7;i++){
window.status = i;
left = left + 100;
document.getElementById('div1').style.left = left;
//document.write("i = " + i + "<BR>");
pause(1000);
}
}
</script>
</head>
<body>
<div id="div1" style="position:absolute; left:20px; top:0px;">das ist text</div>
<a href="javascript:moveIt()">action</a>
</body>
</html>
Hi,
ein immer wieder gerne genommenes Thema ist der nicht vorhandene Timer in JavaScript.
nein, eigentlich kann ich mich nicht erinnern, dass jemals jemand behauptet hätte, in JavaScript gäbe es keinen Timer. Vermutlich liegt das daran, dass es nicht stimmt.
Cheatah
O.k., habe mich vielleicht nicht ganz korrekt ausgedrück. Mit Timer meinte ich einen Wait oder Pause oder wie man es auch immer nennen möchte aber eben keinen setTimeout().
Stefan
nein, eigentlich kann ich mich nicht erinnern, dass jemals jemand behauptet hätte, in JavaScript gäbe es keinen Timer. Vermutlich liegt das daran, dass es nicht stimmt.
Cheatah
Hi,
O.k., habe mich vielleicht nicht ganz korrekt ausgedrück. Mit Timer meinte ich einen Wait oder Pause oder wie man es auch immer nennen möchte aber eben keinen setTimeout().
ja. Ersetze den Wunsch nach einer Pause durch einen Timeout.
nein, eigentlich kann ich mich nicht erinnern, dass jemals jemand behauptet hätte, in JavaScript gäbe es keinen Timer. Vermutlich liegt das daran, dass es nicht stimmt.
Cheatah
Zitiere bitte nur das, worauf Du Dich beziehst, und antworte nach dem Zitat.
Cheatah
ja. Ersetze den Wunsch nach einer Pause durch einen Timeout.
Bezieht sich das jetzt auf meine Formulierung oder ist dies ein Lösungsvorschlag den ich nicht verstehe?
Zitiere bitte nur das, worauf Du Dich beziehst, und antworte nach dem Zitat.
Bin lernfähig (hoffentlich) ;-)
Hi,
ja. Ersetze den Wunsch nach einer Pause durch einen Timeout.
Bezieht sich das jetzt auf meine Formulierung oder ist dies ein Lösungsvorschlag den ich nicht verstehe?
es ist ein Lösungsvorschlag.
Zitiere bitte nur das, worauf Du Dich beziehst, und antworte nach dem Zitat.
Bin lernfähig (hoffentlich) ;-)
Ja, vielen Dank.
Cheatah
Mit Timer meinte ich einen Wait oder Pause oder wie man es auch immer nennen möchte aber eben keinen setTimeout().
AUAH!
setTimeout()
Führt eine Anweisung nach einer bestimmten Verzögerungszeit aus. Erwartet zwei Parameter:
1. Code = Eine JavaScript-Anweisung, die wiederholt werden soll. Meistens ein Funktionsaufruf.
2. Pause = Wert in Millisekunden bis zum Ausführen.
http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout
Gunnar
setTimeout()
Mit dem setTimeout() wird aber leider mein Programmablauf nicht angehalten. Und genau das ist es, was ich möchte.
Hi,
Mit dem setTimeout() wird aber leider mein Programmablauf nicht angehalten.
korrekt.
Und genau das ist es, was ich möchte.
Da Du laut Deinem Ausgangsposting bereits im Archiv gesucht zu haben scheinst, solltest Du wissen, dass etwas derartiges in JavaScript nicht nur unmöglich ist, sondern nicht existieren darf.
Cheatah
Da Du laut Deinem Ausgangsposting bereits im Archiv gesucht zu haben scheinst, solltest Du wissen, dass etwas derartiges in JavaScript nicht nur unmöglich ist, sondern nicht existieren darf.
Dann habe ich wohl nicht richtig gesucht. Wäre dankbar für einen Link.
Stefan
Hallo,
setTimeout()
Mit dem setTimeout() wird aber leider mein Programmablauf nicht angehalten. Und genau das ist es, was ich möchte.
Was hast du denn überhaupt vor, von welchem Programmablauf redest du? In dem von dir genannten Beispiel würde man mit setTimeout oder setInterval problemlos arbeiten können. Bitte beschreibe doch einmal deine Situation genau. Was meinst du mit »Anhalten des Programmes«? Welche Vorgänge laufen denn und sollen angehalten werden? Was davon kannst du nicht durch einen passenden Programmablauf und Hilfsmittel wie setTimeout umsetzen?
Mathias
In dem von dir genannten Beispiel würde man mit setTimeout oder setInterval problemlos arbeiten können.
Dieses Beispiel sollte nur das Verhalten von document.getElementById im Vergleich zu window.status demonstieren und könnte natürlich auch mit setTimeout realisiert werden.
Stefan
Hallo Stefan,
Dieses Beispiel sollte nur das Verhalten von document.getElementById im Vergleich zu window.status demonstieren und könnte natürlich auch mit setTimeout realisiert werden.
Auch wenn ich dein Problem noch nicht ganz durchschaut habe, bist du dir aber schon der Tatsache bewusst, dass getElementById eine relativ "teure" Methode ist, weil erstmal der Dokument-Baum deiner Datei durchlaufen werden muss, um das Element mit der entsprechenden ID zu finden? Nach der Statusleiste hingegen muss nicht erst gesucht werden.
Abhilfe schaffen könnte eine globale Variable, in der du dein gewünschtes Div als Objektreferenz speicherst:
var meinDiv = document.getElementById('div1');
MfG, Mülli
你好 Tobias,
Dieses Beispiel sollte nur das Verhalten von document.getElementById im
Vergleich zu window.status demonstieren und könnte natürlich auch mit
setTimeout realisiert werden.Auch wenn ich dein Problem noch nicht ganz durchschaut habe, bist du dir
aber schon der Tatsache bewusst, dass getElementById eine relativ
"teure" Methode ist, weil erstmal der Dokument-Baum deiner Datei
durchlaufen werden muss, um das Element mit der entsprechenden ID zu
finden? Nach der Statusleiste hingegen muss nicht erst gesucht werden.
Implementationsabhaengig, das kannst du so nicht pauschalisieren. Es gibt
keinen Grund, warum der Interpreter nicht eine Hash-Tabelle ID => Objekt
mitfuehren sollte.
再见,
CK
Hallo Christian,
Implementationsabhaengig, das kannst du so nicht pauschalisieren. Es gibt
keinen Grund, warum der Interpreter nicht eine Hash-Tabelle ID => Objekt
mitfuehren sollte.
Hmm, stimmt. Aber haben es die Interpreter der relevanten Browser implementiert? Bzw. welche haben es implementiert?
MfG, Mülli
你好 Tobias,
Implementationsabhaengig, das kannst du so nicht pauschalisieren. Es
gibt keinen Grund, warum der Interpreter nicht eine Hash-Tabelle
ID => Objekt mitfuehren sollte.Hmm, stimmt. Aber haben es die Interpreter der relevanten Browser
implementiert? Bzw. welche haben es implementiert?
Kann ich dir nicht sagen, aber aufgrund der Geschwindigkeit des IE bei
solchen Sachen wuerde ich vermuten, er nutzt aehnliche Mechanismen. Beim
Mozilla wuerde ich jedoch sagen: wahrscheinlich nicht. Bei letzterem koennte
man es nachpruefen, habe ich jetzt aber auch keine grosse Lust zu :)
再见,
CK
Hi,
left = left + 100;
document.getElementById('div1').style.left = left;
Mal ganz abgesehen von der timer-Frage: die Zuweisung einer Zahl an style.left ist nicht sinnvoll, da style.left nicht eine Zahl, sondern eine Länge oder einen Prozentwert oder den Wert auto oder den Wert inherit erwartet.
cu,
Andreas
Hallo,
while (starttime + zeit > (new Date).getTime() ){;}
diese Zeile liest mit der maximalen CPU-Geschwindigkeit die Uhr des PCs, bis die Endzeit erreicht ist. Dieses belastet die CPU zu 100%. Das ist genau so, als würdest Du in Deiner Mittagspause so oft wie möglich bei der Zeitansage anrufen um zu prüfen, ob die Pause schon vorbei ist.
Bei den meisten Browsern ist es so, dass "interne" Javascriptprozesse, wie z.B. Deine Pause eine höhere Priorität haben, als die Prozesse, die das Browserfenster aktualisieren. Benutze also setTimeout. Schleifen lassen sich (fast) problemlos damit realisieren.
Gruß, Jürgen