Georg: Out of memory bei Layer-Positionierung

Hallo,
ich sitz immer noch vor meinem 11-Zeiler und verzweifle so langsam. Mein Problem ist das ich layer dynamisch positionieren (schlicht und einfach nach unten wegscrollen bis zu einer Posi X) lassen will.
In diesem Zusammenhang hatte ich heute Mittag schon mal ein Prob (übrigens danke für die Hilfe wahsaga!), nun steh ich wieder da:

<script language="Javascript">
<!--
posi01=0;posi02=0;posi03=0;
zaeh01=1;zaeh02=1;zaeh03=1;
function move_slot() {
gone01="-"+posi01+"px"; gone02="-"+posi02+"px"; gone03="-"+posi03+"px";
document.getElementById("slot1").style.top = gone01
document.getElementById("slot2").style.top = gone02
document.getElementById("slot3").style.top = gone03
posi01=posi01+1;posi02=posi02+1;posi03=posi03+1;
zaeh01=zaeh01++;zaeh02=zaeh02++;zaeh03=zaeh03++;
if (zaeh01 <=100 && zaeh02<=100 && zaeh03<=100) {move_slot();}
}
-->
</script>
<<<
Liefert mir immer einen "Out of Memory at Line 10" als Alert-Fehler.
Nun meine Frage: WARUM ???
Gruss
Georg

  1. Hi,

    zaeh01=1;zaeh02=1;zaeh03=1;
    function move_slot() {
    zaeh01=zaeh01++;zaeh02=zaeh02++;zaeh03=zaeh03++;
    if (zaeh01 <=100 && zaeh02<=100 && zaeh03<=100) {move_slot();}

    Du schachtelst hier 100 Aufrufe - kann sein, daß das zu viel ist...

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo Andreas,
      wie kann ich das denn sonst lösen (sorry, bin leider blutiger Anfänger). Der Sinn der Übung ist, das ich die Layer pixelweise bis auf die gewünschte Position bewege (sozusagen automatisch zur richtigen Position scrollen) und diese nicht direkt dort hin "springen". Es sind 3 Layer, die (eigentlich sogar geringfügig zeitversetzt, aber das ist derzeit noch nicht mein Prob) sich bewegen sollen, wobei ich die Endposition als festen Wert vorgebe (im Script jeweils 100).
      Gibt es da bessere Lösungswege ?
      Gruss
      Georg

      1. hallo,

        ich würde window.setInterval verwenden, die eine funktion aufruft, die die layer immer um x pixel nach unten verschiebt.
        wenn du eine bestimmte position ereichst hast, kannst du den window.setInterval wieder beenden
        http://selfhtml.teamone.de/javascript/objekte/window.htm#set_interval

        gruss

        --
        no strict;
        no warnings;
        Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)
  2. Also fangen wir mal an.

    <script language="Javascript">

    hier fehlt das type Attribut:
    <script type="text/Javascript">

    posi01=0;posi02=0;posi03=0;
    zaeh01=1;zaeh02=1;zaeh03=1;

    function move_slot() {
    gone01="-"+posi01+"px"; gone02="-"+posi02+"px"; gone03="-"+posi03+"px";

    Übersichtlickeit ist nicht deine Stärke. Sorry, aber ich mußte mir das mehrmals durchlesen um zu verstehen was da passiert.

    gone01 = "-" + posi01 + "px";
    gone02 = "-" + posi02 + "px";
    gone03 = "-" + posi03 + "px";

    document.getElementById("slot1").style.top = gone01
    document.getElementById("slot2").style.top = gone02
    document.getElementById("slot3").style.top = gone03

    Ich würd hier für eine funktion basteln:

    function setPos(name, pos)
    {
    var obj = document.getElementById(name);
    if(!obj) return null;
    obj.style.top = "-" + posi03 + "px";
    return obj;
    }

    und dann:

    setPos('slot1', posi01);
    setPos('slot2', posi02);
    setPos('slot3', posi03);

    und die zahlen deuten schon darauf hin, das ein Array sinnvoll wäre. Aber lassen wir das.

    posi01=posi01+1;posi02=posi02+1;posi03=posi03+1;
    zaeh01=zaeh01++;zaeh02=zaeh02++;zaeh03=zaeh03++;

    Arrrg, wer soll das lesen

    posi01++;
    posi02++;
    posi03++;

    zaeh01++;
    zaeh02++;
    zaeh03++;

    if (zaeh01 <=100 && zaeh02<=100 && zaeh03<=100) {move_slot();}

    so und jetzt rufst du 100 mal die Funkion rekursiv auf ohne die Funktion zu beenden.

    Du suchst window.setTimeout

    if (zaeh01 > 99) return;
    setTimeout('move_slot()', 100);
    }

    Struppi.

    1. Hi,

      zaeh01=zaeh01++;zaeh02=zaeh02++;zaeh03=zaeh03++;
      Arrrg, wer soll das lesen

      Jetzt seh ich das ja erst:

      zaeh01 = 1;
      //...
      zaeh01=zaeh01++;

      Was steht denn jetzt in zaeh01?

      Zuerst wird die rechte Seite ausgewertet:
      zaeh01++
      zaeh01 wird ausgelesen (was 1 ergibt) und danach erhöht auf 2.

      Dann wird zaeh01 der ausgelesene Wert (nämlich die 1) zugewiesen.

      ==> zaeh01 = 1

      Die Funktion wird also nicht 100mal aufgerufen, sondern unendlich oft bzw. bis der Stack überläuft

      Grundregel: wenn eine Variable mit Post/Pre-In/De-crement-Operator in einem Ausdruck vorkommt, darf sie im selben Ausdruck nicht nochmal verwendet werden.

      cu,
      Andreas

      --
      MudGuard? Siehe http://www.Mud-Guard.de/
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Jetzt seh ich das ja erst:

        zaeh01 = 1;
        //...
        zaeh01=zaeh01++;

        Was steht denn jetzt in zaeh01?

        Zuerst wird die rechte Seite ausgewertet:
        zaeh01++
        zaeh01 wird ausgelesen (was 1 ergibt) und danach erhöht auf 2.

        Stimmt. Ich hatte mich schon gewundert, warum nach 100 mal der Stack überläuft. Aber mir bei den Kostrukten keine Gedanken gemacht, da sie mir in 1.Linie zu unleserlich waren.

        Grundregel: wenn eine Variable mit Post/Pre-In/De-crement-Operator in einem Ausdruck vorkommt, darf sie im selben Ausdruck nicht nochmal verwendet werden.

        Naja, dürfen schon, man muss halt nur Wissen was man macht.

        übrigens ist die pre Version vorzuziehen, da soweit ich das verstanden habe keine Kopie angelegt werden muss (was jetzt bei JS nicht so die Rolle spielt).

        Struppi.