Stefan: Timerproblem:document. bekommt keine Kontrolle bei "pause"

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>

  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

      1. 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

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. 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) ;-)

          1. 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

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
      2. 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

        --
        „Solang wir noch tanzen können
        und richtig echte Tränen flennen,
        ist noch alles offen,
        ist noch alles drin.“
        (Gundermann)
        1. setTimeout()

          Mit dem setTimeout() wird aber leider mein Programmablauf nicht angehalten. Und genau das ist es, was ich möchte.

          1. 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

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. 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

          2. 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

            1. 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

              1. 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

                --
                Viva Colonia!
                1. 你好 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

                  --
                  Der Verstand steht ueber allem. Was durch die Vorstellungskraft nicht geschaffen werden kann, existiert nicht.
                  http://wwwtech.de/
                  1. 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

                    --
                    Viva Colonia!
                    1. 你好 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

                      --
                      Echte Hacker benutzen Aexte. (Thomas Walter in de.org.ccc)
                      http://wwwtech.de/
  2. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. 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