Out of memory bei Layer-Positionierung
Georg
- javascript
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
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
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
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
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.
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
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.