daGizmo: setTimeout() tut nicht was es soll?!

Hallo!

Habe folgenden Code, der für zwei iFrames die Größe anpasst - funktioniert auch soweit, bis auf das, dass die setTimeout-Funktion nicht funktioniert... es müsst den Effekt ergeben, das der iFrame von oben hereingleitet. Hier mal der Code:

function showBill(rnr) {
 varHeight = Fensterhoehe();
 varHeight = varHeight - 74;
 h = 0; //Größe in Prozent

document.getElementById('showBillTheId').style.display = 'inline';

function setFrameSize(h) {
  document.getElementById('rechnungen').style.height = (varHeight/100*h)-3;
  document.getElementById('showBillTheId').style.height = varHeight/100*(100-h);

if (h<31) {
   h++;
   window.setTimeout(setFrameSize(h), 1000);
         }
 }

setFrameSize(h);
}

Wenn ich eine Unterbrechnung einbaue, zB in Form eines alert der den aktuellen Wert von h ausgibt, funktioniert es auch. Es erscheinen 31 alerts, und der Effekt wird genau wie gedacht durchgeführt.

Was mir jetzt völlig unverständlich ist: Warum greift die setTimeout-Funktion in diesem Fall nicht? Habe diese Funktion schon öfters verwendet, ohne Probleme... ich kann mir das nicht erklären : (

Schon mal Danke für jeden Hinweis!

lg. aus Wien!
daGizmo

  1. Hallo!

    ich erinnere mich, dass innerhalb einer Funktion kein Parameter der Funktion an Timeout gegeben werden kann. Es gab hier im Forum auch eine Begründung dazu.

    Also deine Kombination

    function setFrameSize(h) {

    ...

    window.setTimeout(setFrameSize(h), 1000);

    funzt nicht. Offenbar wird an Timeout nur der Pointer auf h übergeben, der natürlich ins Nirwana zeigt, wenn die Funktion verlassen wurde.

    Mach eine Variable h2 ausserhalb der Funktion und fülle sie mit deinem Wert. Und dann sollte window.setTimeout(setFrameSize(h2), 1000); wohl laufen.

    MfG Kalle

    1. Mach eine Variable h2 ausserhalb der Funktion und fülle sie mit deinem Wert. Und dann sollte window.setTimeout(setFrameSize(h2), 1000); wohl laufen.

      Habe die Funktion jetzt umgebaut, wie du gesagt hast (sofern ich das richtig verstanden habe) - die Funktion sieht jetzt so aus:

      function showBill(rnr) {
       varHeight = Fensterhoehe();
       varHeight = varHeight - 74;
       h2 = 0;

      document.getElementById('showBillTheId').style.display = 'inline';

      function setFrameSize(h) {
        document.getElementById('rechnungen').style.height = (varHeight/100*(100-h))-3;
        document.getElementById('showBillTheId').style.height = varHeight/100*h;

      h2++;

      if (h2<71) {
         setTimeout(setFrameSize(h2), 1000);
        }
       }

      setFrameSize(h2);
      }

      leider noch immer ohne Effekt... : (

      1. Mach eine Variable h2 ausserhalb der Funktion und fülle sie mit deinem Wert. Und dann sollte window.setTimeout(setFrameSize(h2), 1000); wohl laufen.

        Habe die Funktion jetzt umgebaut, wie du gesagt hast (sofern ich das richtig verstanden habe) - die Funktion sieht jetzt so aus:

        function showBill(rnr) {
        varHeight = Fensterhoehe();
        varHeight = varHeight - 74;
        h2 = 0;

        h2 ist immer noch innerhalb einer (vergänglichen) Funktion. Ich meinte dieses:

        <script ...>
        var h2;

        // und dann die Funktionen, die h2 füttern und abfragen.

        Kalle

        1. h2 ist immer noch innerhalb einer (vergänglichen) Funktion. Ich meinte dieses:

          <script ...>
          var h2;

          // und dann die Funktionen, die h2 füttern und abfragen.

          Kalle

          Auch das hat das Problem nicht gelöst... habe jetzt die Variable h2 außerhalb der Funktion showBill() deklariert, aber auch das ändert nicht's an der Sache.

          Vielen Dank für deine Bemühungen, aber ich glaube hier liegt ein anderes Problem vor... ich kann es mir auf jeden Fall nicht erklären. Das sind diese berühmten Kleinigkeiten, die einem die Lust auf's Programmieren vergehen lassen. Ich mein... syntaktisch und semantisch passt bei der Funktion eigentlich alles - weiß nicht, was dem Interpreter nicht schmeckt : (

          Es ist jetzt kein Weltungergang.. der Verzicht auf diesen Effekt macht das Programm in keiner Hinsicht schlechter... es wäre halt etwas für's Auge gewesen. Dennoch würde mich brennend interessieren, welches Problem hier vorliegt!

          1. Ich mein... syntaktisch und semantisch passt bei der Funktion eigentlich alles - weiß nicht, was dem Interpreter nicht schmeckt : (

            Das stimmt nicht, du übergibst keine Funktionsreferenz oder einen ausführbaren String, sondern lediglich den Rückgabewert der Funktion, also undefined, dann ist klar dass setTimeout nicht funktioniert.

            Struppi.

  2. Habe folgenden Code, der für zwei iFrames die Größe anpasst - funktioniert auch soweit, bis auf das, dass die setTimeout-Funktion nicht funktioniert...

    du wendest sie auch falsch an.

    window.setTimeout(setFrameSize(h), 1000);

    window.setTimeout()  erwartet entweder einen String oder eine Funktionsreferenz, du rufst aber die Funktion direkt auf.

    Verwende eine anonyme Funktion:
    window.setTimeout(function() {setFrameSize(h);} , 1000);

    Struppi.

    1. Habe folgenden Code, der für zwei iFrames die Größe anpasst - funktioniert auch soweit, bis auf das, dass die setTimeout-Funktion nicht funktioniert...

      du wendest sie auch falsch an.

      window.setTimeout(setFrameSize(h), 1000);

      window.setTimeout()  erwartet entweder einen String oder eine Funktionsreferenz, du rufst aber die Funktion direkt auf.

      Verwende eine anonyme Funktion:
      window.setTimeout(function() {setFrameSize(h);} , 1000);

      Struppi.

      Struppi, das war's! Vielen Dank für die Klärung dieses Problems - wird mir bestimmt nicht nochmal passieren.

      Grüße aus Wien,
      daGizmo