Bastian T.: Funktionsaufrufe werden ignoriert

Hi. ich und mein Menü schon wieder.

Die Patzer von letztens sind ausgemerzt. Jetzt habe ich das Problem, dass in meinem Hauptscript bei den Fallunterscheidungen die ersten zwein Aufrufe der Funktion ignoriert werden.

Hier die gesamte Skriptdatei:

var timer=4;
var jump=5;
var ams="leer";
var layer_bak = "leer";
var apos_bak = 0;
var epos_bak =0;

function hide(layer){
document.getElementById(layer).style.visibility = "hidden";
}

function show(layer){
document.getElementById(layer).style.visibility = "visible";
}

function move (layer,apos,epos) { /*Bewegung der Ebene*/
document.getElementById(layer).style.top=apos;
apos+=jump;
 layer_bak=layer;
 apos_bak=apos;
 epos_bak=epos;
if(apos<=epos) setTimeout("move(layer_bak,apos_bak,epos_bak)",timer);
}

function init_move(wlayer){
if (ams==wlayer){
 switch (wlayer){
 case "top1":
  move ('bottom1',125,25);
  move ('top2',225,125);
  move ('top3',250,150);
  ams="leer";
 break;
 case "top2":
  move ('bottom2',150,50);
  move ('top3',250,150);
  ams="leer";
 break;
 case "top3":
  move ('bottom3',175,75);
  ams="leer";
 break;
}}
else {
 switch (wlayer){
 case "top1":
  document.all.bottom1.style.zIndex = "3";
  document.all.bottom2.style.zIndex = "2";
  document.all.bottom3.style.zIndex = "1";
  hide('bottom2');
  hide('bottom3');
  show('bottom1');
-->  move ('top3',150,250);
-->  move('top2',125,225);
  move ('bottom1',25,125);
  ams="top1";
 break;
 case "top2":
  document.all.bottom1.style.zIndex = "2";
  document.all.bottom2.style.zIndex = "3";
  document.all.bottom3.style.zIndex = "1";
  hide('bottom3');
  hide('bottom1');
  show('bottom2');
  move('top3',150,250);
  move('bottom2',50,150);
  ams="top2";
 break;
 case "top3":
  document.all.bottom1.style.zIndex = "1";
  document.all.bottom2.style.zIndex = "2";
  document.all.bottom3.style.zIndex = "3";
  hide('bottom2');
  hide('bottom1');
  show('bottom3');
  move ('bottom3',75,175);
  ams="top3";
 break;
}}}

Zum besseren Verständnis:
Wird ein Hauptmenü angeklickt hat, sollen die anderen Menüpunkte nach unten rutschen und von oben ein Untermenü eingeblendet werden. Ist das entsprechende Untermenü bereits ausgefahren, soll es wieder zurückgefahren und die anderen Hauptmenüs nachrutschen.

Aber irgendwie werden die ersten beiden Aufrufe von move ignoriert (siehe Pfeil)

Kann mir wer erklären, warum und wie ich das Problem behebe?
Danke!

bdt
Bastian

  1. Hi. ich und mein Menü schon wieder.

    Die Patzer von letztens sind ausgemerzt. Jetzt habe ich das Problem, dass in meinem Hauptscript bei den Fallunterscheidungen die ersten zwein Aufrufe der Funktion ignoriert werden.

    Hier die gesamte Skriptdatei:

    var timer=4;
    var jump=5;
    var ams="leer";
    var layer_bak = "leer";
    var apos_bak = 0;
    var epos_bak =0;

    function hide(layer){
    document.getElementById(layer).style.visibility = "hidden";
    }

    function show(layer){
    document.getElementById(layer).style.visibility = "visible";
    }

    function move (layer,apos,epos) { /*Bewegung der Ebene*/
    document.getElementById(layer).style.top=apos;
    apos+=jump;
     layer_bak=layer;
     apos_bak=apos;
     epos_bak=epos;
    if(apos<=epos) setTimeout("move(layer_bak,apos_bak,epos_bak)",timer);
    }

    [....]

    move ('bottom1',125,25);
      move ('top2',225,125);
      move ('top3',250,150);

    Da ich eh kein freund von diesen Menüs sind, die dann alle Links einer Seite in ein Dokument packen um angeblich leichter navigieren zu können (du solltest dir eine Verzeichniss struktur überlegen, das die Navigation intuitiv ermöglicht), les ich mir nicht alles durch.

    Aber was mir auffällt an dem obigen Schnipsel.
    du rufst die Funktion move auf, speicherst darin drei Variabeln um dann wieder per timeout die Funktion move aufzurufen. So weit so schlecht. Aber weiter unten rufts du die Funktion dreimal auf, dass bedeutet 3 Aufrufe und dreimal werden die globalen Variabeln layer_ba, apos_bak, epo_bak gesetzt, dann wir dreimal der timergesetzt.

    Ich glaube nicht das das ist was du willst. Das was du erreichen möchtest ist ungleich schwieriger. Du musst mit Arrays arbeiten, Objekten und diese mit dem Timer irgendwie überprüfen.

    Das ist alles ein sehr müßiges Unterfangen was du da vorhast, nur wegen einem Menü, das sich viel einfacher mit HTML und ein bisschen Wartezeit erledigen liesse.

    Struppi.

    1. Ich glaube nicht das das ist was du willst. Das was du erreichen möchtest ist ungleich schwieriger. Du musst mit Arrays arbeiten, Objekten und diese mit dem Timer irgendwie überprüfen.

      Mit dem schwieriger magst du Recht haben. Ich weiß auch, dass ich die Steuerung der Ebenen und so sauberer mit Arrays steuern könnte. Aber mit Arrays hatte ich es noch nie so. Deswegen die Geschichte mit den Variablen. Und halt global, weil setTimeout lokale Variablen löschen würde. Und die muss ich halt haben, da ich move ja miiteilen muss, welchen Layer ich von wo nach wo bewegen möchte.

      Das ist alles ein sehr müßiges Unterfangen was du da vorhast, nur wegen einem Menü, das sich viel einfacher mit HTML und ein bisschen Wartezeit erledigen liesse.

      Ich geb halt so ungerne auf. Aber langsam bin ich kurz davor.
      Dank dir trotzdem.

      bdt
      Bastian