MacGreg: for-Schleife, Funktionsaufruf + SetTimeout

Hallo SelfHTML Forum!

Ich möchte ein Div über das "Verschwindenlassen" von darüberliegenden "Balken-Divs" einblenden. Man stelle sich einen quadratischen Container vor der mit Querbalken überlagert ist, die nach und nach mit folgender JS Funktion "kleiner werden"..

function slidehide(id) {
  obj = document.getElementsByTagName("div");
  obj[id].style.width = j;
  j = j - 20;
  idvar = id;
  if(j == -4) { //j ist global definiert
  ShowHide(id,'hidden');}
  if(j > 0) {
  window.setTimeout("slidehide('"+idvar+"');",1);
  }
}

und mit dieser Funktion

function ShowHide(id, visibility) {
    obj = document.getElementsByTagName("div");
    obj[id].style.visibility = visibility;
}

dann verschwinden (ausgeblendet werden).
Nun habe ich über meinem quadratischen Div 33 dieser "Balken-Divs" liegen die ich gerne (zB durch Aufruf einer For Schleife) nach und nach kleiner werden und verschwinden lassen würde.

Leider schlugen all meine Versuche die slidehide() Funktion aus einer Schleife aufzurufen fehl, und ich denke mal es liegt an dem SetTimeout() das mir da einen Strich durch die Rechnung macht..

Hat jemand einen Ratschlag wie ich mein Problem lösen kann?

Danke im Voraus,

MacGreg

  1. Hallo,

    Leider schlugen all meine Versuche die slidehide() Funktion aus einer Schleife aufzurufen fehl,

    wie sieht denn diese Schleife aus?
    Und: wäre die Benutzung von window.setInterval() für Deine Zwecke nicht naheliegender?

    Ciao,
    Andreas

    1. Hi,

      wie sieht denn diese Schleife aus?

      function startsh() {
        for(id = 1; id <= 33; id++) {
        slidehide(id);
        }
      }

      Und: wäre die Benutzung von window.setInterval() für Deine Zwecke nicht naheliegender?

      kenne ich gar nicht, werds mir mal anschauen.. danke schon mal :-)

      MacGreg

      1. Tja, window.setInterval mag naheliegender sein, führt aber in der Praxis zum selben Ergenis :-(

        Wie es mir scheint, nimmt die for-Schleife die slidehide() aufruft, keine Rücksicht darauf ob slidehide() nun schon komplett druchgelaufen ist oder nicht... Wie kann ich erreichen, dass die for-Schleife erst dann inkrementiert wenn slidehide() "fertig ist"?

        MacGreg

        1. hi,

          Wie es mir scheint, nimmt die for-Schleife die slidehide() aufruft, keine Rücksicht darauf ob slidehide() nun schon komplett druchgelaufen ist oder nicht...

          wieso sollte sie denn auch? sie ist doch vollkommen unabhängig davon.

          Wie kann ich erreichen, dass die for-Schleife erst dann inkrementiert wenn slidehide() "fertig ist"?

          so ohne weiteres: gar nicht.
          es gibt in JS keinerlei "pause"-befehl o.ä.

          du könntest aber stattdessen dafür sorgen, dass slidehide() selber den "nächsten" punkt aufruft, wenn es mit seiner ausführung fertig ist (unter verzicht auf die for-schleife dann natürlich).

          gruß,
          wahsaga

          --
          "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
        2. Wie es mir scheint, nimmt die for-Schleife die slidehide() aufruft, keine Rücksicht darauf ob slidehide() nun schon komplett druchgelaufen ist oder nicht... Wie kann ich erreichen, dass die for-Schleife erst dann inkrementiert wenn slidehide() "fertig ist"?

          Genau darauf wollte ich hinaus.
          Die for-Schleife weiß natürlich nichts von einem Timeout. Die for-Schleife ruft nur eine Funktion bzw. Methode setTimeout auf und verwirft deren Rückgabewert (in Deinem Script jedenfalls).
          Und dann geht's weiter mit dem nächsten Schleifendurchlauf.

          Eine zeitgesteuerte Schleife läßt sich eben mit setInterval() umsetzen:

          var myInterval;

          function doSomething() {
            // veraendere die Hoehe des DIV-Elements
            // prufe, ob Abbruchbedingung erfuellt
            // wenn ja -> Intervall abbrechen
            if(...) window.clearInterval(myInterval);
          }

          // Anstossen der zeitgesteuerten Schleife
          myInterval = window.setInterval('doSomething()', 500);

          Hilft Dir das?

          Ciao,
          Andreas

          1. var myInterval;

            function doSomething() {
              if(...) window.clearInterval(myInterval);
            }

            // Anstossen der zeitgesteuerten Schleife
            myInterval = window.setInterval('doSomething()', 500);

            Hilft Dir das?

            Ja, das hat mir sehr geholfen! Vielen Dank!

            MacGreg