Philipp B: Geht das nicht kürzer?

Beitrag lesen

function rollout(name)
{

»»  obj = eval("document.all."+name);
»»  for(i = 1;i < 110;i++)
»»  {
»»   k = -47 + i;
»»   obj.style.setAttribute('left',k,'false');
»»   for(l = 1;l < 75;l++)
»»   {}
»»  }

}

Hättest Du eine Idee, wie ich den IE dazu bekomme, daß das div-Tag, das dahinter steht auch langsam rausfährt und nicht aus dem NICHTS auftaucht? Im Netscape funzt das, doch der IE gibt keine Zwischenergebnisse raus.

Du solltest Zeitverzögerungen niemals mit leeren Warteschleifen schreiben.(Zumindest nicht mehr, seitdem Betriebssysteme Multitaskingfähig sind.)
IE erkennt anscheinend sogar die leere for-Schleife und übergeht sie einfach.
Prinzipiell brauchts Du sowas:

var rolloutCount
function rollout(name)
{
  ...

rolloutCount--;
  if (rolloutCount>0)
{  window.setTimeout("rollout()",10000 }
  }

aufrufen mit:

rolloutCount=110;
rollout(name);

mit setTimeout startest Du die funktion nocheinmal nach einer festgelegten Zeitspanne. Die Zeit dazwischen kann der Computer für irgendwas anderes nutzen und muß keine leere Schleife abarbeiten.
Wenns schneller gehen soll -> die 10000 runtersetzen, das sollen 1/10 oder 1/100 Sekunden sein, halt die Wartezeit, aber Ausprobieren klappt besser als Ausrechnen.

In der Form, wie ich das da oben gemacht habe, ergibt sich aber auch ein neues Problem aus dem Bereich 'nebenläufige Prozesse':
Wenn jetzt ein Element gerade bewegt wird während der User mit seiner Maus die Bewegung eines zweiten Elements veranlasst, geht das komplett schief, weil dieselbe Funktion und derselbe Zähler benutzt wird.
zumindest theoretisch gibts 2 Lösungen:

Billiglösung:  noch eine boolsche Variable benutzen, die festlegt, ob noch ein Layer bewegt wird, und so veranlassen, daß kein zweites Bewegen gestartet wird, solange das erste nicht beendet ist.
Dürfte ganz gut aussehen, solange die eigentliche Bewegung schnell und damit schnell beendet ist.

Lösung, die kompliziert ist:
(So macht man sowas in Java) das ganze als Thread-Klasse definieren und für jede Bewegung eine neue Instanz bilden.
Das geht in JS wohl nicht, Du könntest vielleicht ein Variablenfeld o.ä. definieren, für jede Bewegung einen Zähler und die Zähler-nummer mit im Aufruf von rollout übergeben, rollout müsste dann nur diesen Zähler runterzählen und in settimeout wieder sich selbst mit dem selben Zähler aufrufen.
Der Aufruf wird dann aber noch kompliziert, weil du beim Start einer neuen Bewegung immer erst eine Zählernummer rausfinden müsstest, die noch nicht benutzt wird.
(funktioniert aber auf jeden Fall irgendwie)

Ist alles ein bisschen overkill, aber wenn man sowas schon macht, dann sollte es auch glatt laufen, sonst produziert man bloss eine weitere Seite der Art 'Viel Spielkram und kaum zu bedienen'.

Naja, viel Erfolg, das ist hart, aber das schaffst du schon.

Philipp