Sven: Überwachen, ob Befehl ausgeführt wurde, bevor nächster Befehl kommt

Hallo!

Ich habe unter Verwendung der DynLayer von Dan Steinman (http://www.dansteinman.com/dynduo/en/dynlayer-slide.html) ein Auswahl-Menü gebastelt, wo die einzelnen Menüpunkte eingeblendet werden, sobald bestimmte Objekte mit der Maus "überfahren" werden. Sprich: Meine Maus zeigt auf ein Objekt und der Text dazu gleitet ins Bild. Zeigt meine Maus nun auf ein anderes Objekt, fährt der alte Text wieder weg und der neue kommt herein.

Das klappt auch alles ganz wunderbar, nur wenn ich die Maus zu schnell über die Objekte bewege, kommen ganz viele Texte ins Bild und bleiben auch da, weil der Befehl für den neuen Text kam, bevor der alte Text überhaupt im Bild war.

Nun dachte ich mir, eventuell zu überwachen, ob der Text an seinem zugewiesenen Platz ist, bevor der nächste geladen wird. Aber das klappt nicht so richtig! Ich habe es folgendermaßen versucht:

if (x != 0) {
if(ns4) {if (document.layers[oldNum].top == x) {check=1};};
if(ie4) {if (document.all[oldNum].offsetTop == x) {check=1};};
}

"x" ist dabei der Wert "Oben" des zuletzt aufgerufenen Textes, während "oldNum" die Nummer eben dieses Textes, bzw. seines Layers/DIVs ist.

Vor Aktivierung des neuen Befehls wird nun geprüft, ob "check" gleich 1 ist und wenn dies zutrifft, wird wieder ein Befehl akzeptiert. Ist "check" aber gleich 0, dann nicht. Dummerweise ist check aber immer null und so passiert auch nix...

Kann mir da vielleicht jemand helfen?

Gruß,
Sven

  1. Hi Sven,

    ich denke, Du bist da schon auf dem richtigen Weg. Ich würde so rangehen:

    function irgendwas()
    {
    while (check == 0)
      {
      }
    // damit passiert halt erst mal nix, während check 0 ist
    // jetzt geht's weiter - erst mal andere Funktionen sperren
    check = 0;
    // hier dann die eigentliche Funktion, und am Ende dann andere Funktionen wieder freigeben:
    check = 1;
    }

    Aber Obacht! Keinesfalls aus der Funktion wieder rausspringen, bevor check wieder auf null ist! Und auch Obacht! while ist immer n bisschen riskant, wenn se aus irgendwelchen ründen passieren kann, dass die Bedingung sich nicht mehr ändert. Dann hast Du ne wundervolle Endlosschleife...

    Hoffe das bringt die Gedanken ein wenig auf die Sprünge...

    Grüße,

    Utz

  2. Hi Sven,

    ich hatte auch so ein Problem mit der Laufzeitkontolle unter JS.

    Meine Erfahrung: du kannst die Laufzeit nicht kontrollieren.

    In JS passieren ganz merkwürdige Dinge richtung Parralelverarbeitung von arithmetischen und grafischen Prozessen.

    Du kannst auuch nicht einfach mal so mit einer Wihleschleife auf etwas warten, weil du kein sleep(); hast. D.h. in der Zeit wo du wartest ist er mit warten beschäftigt und macht nichts anderes.

    Du hast auch keine Threats.

    Du hast nur Timer, mit dehnen du immer mal schaun kannst, ob da schon was passiert ist.
    Nachteil: Timer ist immer an window gebundden und lässt sich aus Funktionen herraus schlecht aufrufen.

    Du drehst dich also mit solchen Ambitionen nur im Kreis.
    Geh das Problem anders an.

    Ich hab bei meinen Menus in den onMouseOver Eventhandler des Body eine CloseallMenus(); hineingehangen.

    Die schaut nur schnell, ob Menus offen sind und schließt die entsprechenden.

    Damit bist du immer sicher, das nur das aktuelle offen ist, wenn sich die Maus darüber befindet, weil der Event dann nicht im Body auftritt.

    Viel Spass beim DHTMLen

    ALEX

  3. Hi Sven,

    Ich hatte vor einiger Zeit das gleiche Problem. Zunächst habe ich mir auch so eine Abfrage eingebaut, wie du es planst, das hatte allerdings den unangenehmen Effekt, dass das ganze Handling mies wurde, soll heissen, die Mouseover wurde ziemlich störrisch, aus der Sicht des Benutzers war das nur verwirrend.

    Ich habe das Problem dann an der Wurzel angepackt: Die wild halb ein- halb ausgeklappten Menupunkte wenn man schnell mit der Maus drüber fährt liegen ja daran, dass eine Variable noch gar nicht wieder auf einem bestimmten Endwert steht aber schon einen neuen Wert vom nächsten Mouseover/Mouseout zugewiesen bekommt. Daher hilft es, einfach jedem Funktionsaufruf eine eigene Variable zuzuteilen, dann kann sich auch nichts in die Quere kommen. Das bläht den Quellcode zwar ziemlich auf, aber das Ergebnis ist top.

    Hoffe das hilft dir weiter.

    Viele Grüsse,
    Edgar