skai: Event-Auswertung während Do while

Hallo Forum,

ich hätte da mal gerne ein Problem :-)
Ich möchte bei document.onmouseout eine Aktion starten, die in einer Schleife wiederholt abläuft, solange die Maus gedrückt bleibt. Bei document.onmouseup soll die Aktion stoppen.
Ich habe das so versucht (nur skizzenhaft):

document.onmouseout = starte;
document.onmouseup = stoppe;
var flag=true;

function starte() {
do {
   hierPassiertWasMehrmals();
}while(flag);
}

function stoppe() {
flag = false;
}

Geht aber nicht. Stoppe() wird nie erreicht.
Ich wäre echt dankbar für eine Idee.
Danke,

skai

  1. ich hätte da mal gerne ein Problem :-)

    Na, dann mal los: Probleme gibt's hier besonders günstig.

    Ich möchte bei document.onmouseout eine Aktion starten, die in einer Schleife wiederholt abläuft, solange die Maus gedrückt bleibt. Bei document.onmouseup soll die Aktion stoppen.

    Das wird schon mal schwierig: Die beiden Eventhandler haben m.E. miteinander wenig zu tun - onMouseUp tritt ein, wenn die Maustaste losgelassen wird, onMouseout tritt ein, wenn der Mauszeiger ein gegebenes Element verlässt. Das erste ist sozusagen ein drag-, das zweite dagegen ein click-event. "Gegenteile" können sein: onMousedown und onMouseUp bzw. onMouseover und onMouseout. Check http://de.selfhtml.org/javascript/sprache/eventhandler.htm

    document.onmouseout = starte;

    Falsch: starte();

    document.onmouseup = stoppe;

    Dito: stoppe();

    do {
       hierPassiertWasMehrmals();
    }while(flag);

    while(flag) - was meinst Du damit? Steht flag nur als Skizze für eine Bedingung? Check http://de.selfhtml.org/javascript/sprache/schleifen.htm#while. Viel einfacher allerdings löst Du Dein Problem m.E. mit einer simplen for-Schleife. Check  http://de.selfhtml.org/javascript/sprache/schleifen.htm#for

    Ich wäre echt dankbar für eine Idee.

    Bittesehr. Herzlich, twb

    1. document.onmouseout = starte;
      Falsch: starte();

      document.onmouseup = stoppe;
      Dito: stoppe();

      Nein. Es soll auf das Funktionsobjekt verwiesen werden, die Funktion soll nicht ausgeführt werden.

      Mathias

      1. Nein. Es soll auf das Funktionsobjekt verwiesen werden, die Funktion soll nicht ausgeführt werden.

        Geschrieben: Stattgegeben.
        Und gedacht: Uff! Ich geh' besser schlafen...

        Herzlich, twb

  2. Hallo skai,

    document.onmouseout = starte;

    dies tritt ein, wenn der Mauszeiger den Anzeigebereich des Browser verlässt.

    document.onmouseup = stoppe;

    der Mauszeiger ist jetzt also ausserhalb des Anzeigebereichs und wenn man die Maustaste jetzt loslässt passiert logischerweise nichts, weil du dich ja nicht mehr innerhalb vom "document" befindest und somit auch kein Eventhandling mehr möglich ist.

    Anders kann ich mir dein Problem nicht erklären, da deine Fehlerbeschreibung leicht dürftig ausgefallen ist.

    MfG, Mülli

    --
    Viva Colonia!
  3. Hallo Leute,

    erstmal Danke für die Antworten. Löst leider alles nicht das Problem.

    • Mülli: Wenn ich in starte() keine Schleife einsetze, wird stoppe erreicht, auch wenn es außerhalb des Frames geschmissen wird. (Ich habe vernachlässigt zu sagen, dass ich frames verwende, und das Mouseout also beim Wechsel in den Nachbarframe auftritt)
    • twb: Der Einsatz dieser speziellen Eventhabdler macht in meinem Fall schon Sinn.
      Noch jemand eine Idee?

    Danke,

    skai

    1. Hallo,

      erstmal Danke für die Antworten. Löst leider alles nicht das Problem.

      • Mülli: Wenn ich in starte() keine Schleife einsetze, wird stoppe erreicht, auch wenn es außerhalb des Frames geschmissen wird.

      Ständig laufende while-Schleifen hängen gerne Mal den Browser auf, sodass er nicht reagiert. Musst du wirklich eine solche verwenden, was soll denn dauernd immer wieder ausgeführt werden? Möglicherweise bist du mit setInterval und clearInterval besser beraten.

      Mathias

      1. Hallo Mathias,

        Danke, das hat's echt gebracht! Damit funktioniert es.
        Super, Vielen Dank.

        Gruß,

        skai

  4. Hi,

    function starte() {
    do {
       hierPassiertWasMehrmals();
    }while(flag);
    }

    Die while Schleife ist vermutlich zu schnell fuer das was Du machst, nutze fuer sowas einen intervat/timeout:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
    <html>
    <head>
    <script language="javascript1.2" type="text/javascript">
    var flag    = true;
    function starte() {
        txt =  document.createTextNode("x");
        document.getElementById("out").appendChild(txt);
        if (flag) setTimeout("starte()",50);
        else flag = true;
        return false;
    }
    function stoppe() {
        flag = false;
    }
    function init() {
        document.onmousedown    = starte;
        document.onmouseup      = stoppe;
    }
    </script>
    </head>
    <body id="out" onload="init()">
    Ausgabe:
    </body>
    </html>

    Gruesse, Joachim

    --
    Am Ende wird alles gut.