p@t: was macht setTimeout eigentlich?

hallo,
da ich jetzt schon den 2en tag dran bin eine kleine verzögerung in eine
layer einblendung/ausblendung einzubauen und einfach nicht dahinterkomme, will ich
doch noch einmal ganz von vorn anfangen!

setTimeout ist doch dazu da, eine funktion nach einer gewissen zeit
auszuführen oder etwa nicht?

nun gut das scheint ja auch zu funktionieren solange dies nur einmal
geschehen muss. Allerdings funkt es nicht mehr wenn ich in einer while
schleife bestimme dass eben die einblendung öfters vonstatten gehen soll.

nach der einblendung soll die ebene auch wieder ausgeblendet werden !!!

wie gesagt wenn js das nur einmal machen soll geht es ok! wenn es die
funktionen ein zweites mal durchlaufen soll, dann scheint eS mir irgendwie
die ausblendfunktion zu überspringen, obwohl die eigentlich unmittelbar
nach dem timeout aufruf folgt!

zum besseren verständnis hier ein auszug aus dem scrikpt:

//hier die funkt. welche mir durchlaufzahl festlegt!

function ebene()
{
 while(x < zahl)
 {
  anfang++;ende++;
  wert = anzahl.slice(anfang, ende);
  auf();
 }
}

// hier die funkt. die den layer einblendet (von macromedia (verzeiht mit ;-) )

function auf()
{
 x++;
 MM_showHideLayers(""+wert+"",'','show');
 window.setTimeout("nix()",500);
}

// und jetzt nach 500millisek die funktion die nix tut ausser zu aufzurufen!

function nix()
{
 zu();
}

// layer wiede schliessen und anschliessend weiter zu funkt. ebene!!!

function zu()
{
 MM_showHideLayers('1','','hide','2','','hide','3','','hide','4','','hide');
 ebene();
}

please help! bin echt am verzweifeln, da ich so langsam denke dass ich
einem ganz fatalen denkfehler nachgehe!

muchas gracias
p@

  1. Morjen !

    zum besseren verständnis hier ein auszug aus dem scrikpt:

    ^^^^^^^^^^^^^^^^^^^^ nein, leider nicht wirklich

    trotzdem ein paar Gedanken:

    • ich gehe davon aus das die Variablen richtig definiert sind(insbesondere x, da es von mehreren Funktionen genutzt, aber niemals übergeben wird)

    • der Ablauf scheint mir etwas konfus zu sein:
      1. ebene()
         x < zahl, ruft auf() auf
      2. auf()
         erhöht x
         ruft MM_showHideLayers(""+wert+"",'','show') auf
         setzt den timer für nix()
         zurück zu 1.

    je nach Laufzeitdauer von MM_showHideLayers(""+wert+"",'','show') wird jetzt entweder nach Ablauf der Dauer nix() gestartet _oder_ der Timer für nix() neu gesetzt

    • wenn du aber sagst das das Ganze beim erstenmal funktioniert, nehme ich eher an das beim zweiten Aufruf der Eintrittswert von x dem Austrittswert vom ersten Durchlauf enspricht. Lange Rede kurzer Sinn: beim zweiten Aufruf ist die Abbruchbedingung für die while Schleife von Anfang an erfüllt. Oder noch kürzer: setze x wieder auf den Startwert

    MfG McNavc

    PS: etwas umständlich erklärt, aber um die Zeit ;-)

    1. Morjen !

      zum besseren verständnis hier ein auszug aus dem scrikpt:
             ^^^^^^^^^^^^^^^^^^^^ nein, leider nicht wirklich

      SORRY!

      trotzdem ein paar Gedanken:

      • ich gehe davon aus das die Variablen richtig definiert sind(insbesondere x, da es von mehreren Funktionen genutzt, aber niemals übergeben wird)
      • der Ablauf scheint mir etwas konfus zu sein:
      1. ebene()
           x < zahl, ruft auf() auf
      2. auf()
           erhöht x
           ruft MM_showHideLayers(""+wert+"",'','show') auf
           setzt den timer für nix()
           zurück zu 1.

      je nach Laufzeitdauer von MM_showHideLayers(""+wert+"",'','show') wird jetzt entweder nach Ablauf der Dauer nix() gestartet _oder_ der Timer für nix() neu gesetzt

      ja!

      • wenn du aber sagst das das Ganze beim erstenmal funktioniert, nehme ich eher an das beim zweiten Aufruf der Eintrittswert von x dem Austrittswert vom ersten Durchlauf enspricht. Lange Rede kurzer Sinn: beim zweiten Aufruf ist die Abbruchbedingung für die while Schleife von Anfang an erfüllt. Oder noch kürzer: setze x wieder auf den Startwert

      ich setze x bei jeder runde wieder auf 0, hieran liegts nicht!

      PS: etwas umständlich erklärt, aber um die Zeit ;-)

      trotzdem danke!

      noch mal: von der logik her dass setTimeout das nächste script verzögert ist doch richtig oder???
      und dieses timeout ist doch eigentlich geschichte sobald die funktion dann ausgeführt wird oder???
      ich krieg echt noch hörner mit dem ding! warum hat js keine pause function o.ä?!

      greetz p@

      1. Tagchen !

        • der Ablauf scheint mir etwas konfus zu sein:
        1. ebene()
             x < zahl, ruft auf() auf
        2. auf()
             erhöht x
             ruft MM_showHideLayers(""+wert+"",'','show') auf
             setzt den timer für nix()
             zurück zu 1.

        je nach Laufzeitdauer von MM_showHideLayers(""+wert+"",'','show') wird jetzt entweder nach Ablauf der Dauer nix() gestartet _oder_ der Timer für nix() neu gesetzt

        ja!

        Entweder hab ich's schlecht erklärt, oder wir reden aneinander vorbei :)

        Ich versuchs noch mal mit einem Beispiel (die Zeiten sind zum besseren Verständniss natürlich übertrieben):

        • der Timer zum Ausführen für nix() wird auf 5 Sekunden gesetzt
        • die Ausführung von MM_showHide... plus das JS brauchen 1 Sekunde
        • nach 1 Sekunde: hat der Timer jetzt den Wert 4 und (!)
        • das JS setzt den Timer wieder auf 5
          => falls das ohne 'clearTimeout()' überhaupt geht (?)
          -- wird die Funktion nix() _nur_  1x, und zwar nach Beendigung des Skripts (+ 5 Sekunden) aufgerufen (bzw. wenn das Skript in einem endlos-loop liegt _niemals_)
          => falls sich der laufende Timer nicht überschreiben (neu setzen) lässt:
          --- wird das JS und die Funktion MM_showHide... 5x ausgeführt
          --- und genau nach Beendigung des 5. MM_showHide... hat der Timer den Wert 0 erreicht
          --- ergo wird jetzt die Funktion nix() aufgerufen

        Problem:
        im 1. Fall (timer wird überschrieben) ist der Ablauf Laufzeitbedingt, d.h. ist _NICHT_ vorhersehbar
        (genausogut kann ja der Timerwert kleiner sein als die Dauer, in dem Fall würde nix() _irgendwo_ dazwischenfunken)

        im 2. Fall erscheint es mir irgendwo sinnlos die Funktion nix() nur sporadisch aufzurufen - dies könnte man auch ohne Timer z.B. mit einem Zähler lösen

        Gesamtproblem:
        Ich kann auf Grund des Skripts nicht erkennen wann nix() eigentlich starten soll

        Versuchen wir's vielleicht mit einem einfachen Ablaufplan:
        1. Layer anzeigen
        2. Verzögerung
        3. Layer ausblenden
        4. Verzögerung
        5. weiter bei 1.

        Wenn es das ist was du willst, kommst du mit zwei Funktionen aus:

        function layerEin()
        1. Layer einblenden
        2. Layerwert erhöhen
        3. Timer für layerAus() setzen

        function layerAus()
        1. Layer ausblenden
        2. Timer für layerEin() setzen

        MfG McNavc