SteBu: Prob. mit einer while-Schleife

Moin alle zusammen,

also irgendwie versteh ich es nicht. Haben while-Schleifen in Javascript ein anderes Verhalten als bei "echten" Prgrammiersprachen?

Folgendes, eine While-Schleife soll über ein Timeout eine andere Fkt aufrufen. in der anderen Funktion wird die Abbruchbedingung hochgezählt, aber die Schleife zieht alles in einem rutsch durch. Naja nen Bsp. macht es bestimmt anschaulicher
var tmp=100;
var endeL=1000;

while(tmp<endeL)
     {
        window.setTimeout("rechts()",1000);
     }
function rechts()
 {
  document.getElementById('ball').style.left = startL+step+'px';
  tmp=parseInt(document.getElementById('ball').style.left);
 }
die Fkt. rechts() wird nur 1x aufgerufen (Kontrolliert mittels Alert)
Ist da irgendwo ein (Denk)Fehler?

Ein anderes Prob habe ich auch noch. Ich habe den Div mit der ID "ball" im CSS-Teil absolut positioniert sowie mit left und top an die gewünschte Stelle gesetzt.
Wenn ich jetzt mit alert(parseInt(document.getElementById('ball').style.left)); die Position haben will steht sie mir nicht zur verfügung.
erst nach einem 2ten Funktionsaufruf ist die Position da. Woran kann das liegen?

Danke sagt
SteBu

  1. Folgendes, eine While-Schleife soll über ein Timeout eine andere Fkt aufrufen. in der anderen Funktion wird die Abbruchbedingung hochgezählt, aber die Schleife zieht alles in einem rutsch durch.
    var tmp=100;
    var endeL=1000;

    while(tmp<endeL)
         {
            window.setTimeout("rechts()",1000);
         }
    function rechts()
     {
      document.getElementById('ball').style.left = startL+step+'px';
      tmp=parseInt(document.getElementById('ball').style.left);
     }
    die Fkt. rechts() wird nur 1x aufgerufen (Kontrolliert mittels Alert)
    Ist da irgendwo ein (Denk)Fehler?

    Hab mal versucht, dass nachzuvollziehen, vielleicht liegts daran, dass die Schleife außerhalb einer Funktion steht, denn soweit ich weiß wird das Script von oben nach unten abgearbeitet, sodass die Schleife gar nicht als solche arbeitet.
    Wenn man also eine Funktion draus macht, zB

    function wiederholen()
     {
       while(tmp < endeL)
         {
           window.setTimeout("rechts()", 1000);
         }
     }

    könnt es schon eher funktionieren. Allerdings ist mir aufgefallen, dass da eine Endlosschleife entstehen könnte:

    function rechts()
     {
      document.getElementById("ball").style.left = startL+step+'px';
      tmp = parseInt(document.getElementById('ball').style.left);
     }

    Beim ersten Aufruf wird tmp verändert und hat jetzt zB den Wert 200.
    Die Schleife stellt fest, dass 200 kleiner als 1000 ist und rechts() wird erneut ausgeführt. Da du jedoch startL und step nicht veränderst, bleibt der Wert von "style.left" gleich, demnach ist auch tmp wieder 60 und die Schleife bricht nicht ab.

    --
    life's for the living. so check me tomorrow [Matthew Good Band]
    1. tmp ist natürlich nicht wieder 60 sondern 200... Irgendwie spukte der Wert 60 noch in meinem Kopf... Sorry! :)

      --
      life's for the living. so check me tomorrow [Matthew Good Band]
      1. erstmal danke. Also ich vergas. Die while-Schleife liegt in einer Fkt. die über eine Link aufgerufen wird.
        So hier mal der umgebaute Code, der in C++ z.B. (nach Anpassung) läuft. Jetzt habe ich nur noch das Prob, das parseInt in der Fkt rechts ein NotANumber bringt. Und daher nicht läuft. Wieso das?
        css für den Ball:

        #ball
        {
        position:absolute;
        top:160px;
        left:100px;
        z-index:100;
        }

        <div id="ball"><a href="javascript:moveball()"><img src="ball.gif" width="20" height="19" border="0" alt=""></a></div>
        <script language="javascript" type="text/javascript">
        var step = 5;
        var endeL = 810;
        var endeT = 450;
        var tmp=100;
        var cnt=0;

        function moveball()
        {
             if(cnt%2==0)
             {
              while(tmp<endeL)
               {
                window.setTimeout("rechts()",1000);
                tmp = tmp+step;
               }
             }
             else
             {
              //hier der Code für den Rückweg
             }
             cnt++;

        }
        function rechts()
        {
        x = parseInt(document.getElementById('ball').style.left)
        //alert(x); //Kontrolle ++++hier kommt das NaN
        x=x+step;
        document.getElementById('ball').style.left = x+'px';

        }
        </script>

        SteBu

  2. var tmp=100;
    var endeL=1000;

    while(tmp<endeL)
         {
            window.setTimeout("rechts()",1000);
         }

    Du solltest dich mit der Wirkungsweise von Timeout beschäftigen. Du setzt hier 900 Timeouts, die dann alle ungefähr gleichzeitig aufgerufen werden. Ich glaube nicht, dass das ist was du willst.

    Struppi.

  3. Hi,

    Ein anderes Prob habe ich auch noch. Ich habe den Div mit der ID "ball" im CSS-Teil absolut positioniert sowie mit left und top an die gewünschte Stelle gesetzt.
    Wenn ich jetzt mit alert(parseInt(document.getElementById('ball').style.left)); die Position haben will steht sie mir nicht zur verfügung.

    Mit element.style.eigenschaft kannst du nur Inline-Styles auslesen, also solche, die direkt im Element definiert sind.

    Ansonsten hat Struppi natürlich Recht: Du setzt viele Timeouts sehr schnell hintereinander. Nimm doch lieber eine Funktion, die das Div jeweils einen Schritt bewegt und sich nach einem Timeout selbst wieder aufruft.

    Grüße, Stefan

    --
    Selfforum Plus-Pack: http://zapp.i-networx.de/