Heph: onclick-Event blockieren

Hallo,
ich habe ein Problem mit Mouse-Events, ich versuche es mal allgemein zu beschreiben:
Auf dem Dokument ist ein onClick-Handler (z.B. für ein Kontextmenü), ich nutze bei verschiedenen Objekten onmousedown/onmouseup um die Elemente zu verschieben. Wenn ich das Element verschoben habe möchte ich den click irgendwie blockieren, wenn ich das Element vom Verschieben los lasse soll das Kontextmenü z.B. nicht aufgerufen werden.
Natürlich wäre es möglich einen Eventhandler zu schreiben der die events verteilt. Um die Funktionen die den click bzw das up/down nutzen unabhängig zu halten hätte ich aber lieber sowas:
wenn der mouseup nicht an der gleichen Stelle wie der mousedown ist wird das event click nicht ausgelöst.

Ich hatte dazu nur die idee den click-Handler des Dokuments beim down auf null zu setzen und beim up wieder zurück. Hat aber nicht geklappt weil der up wohl vor dem click auslöst und somit der Handler zu früh zurück gesetzt wird, außerdem ist das denke ich ziemlich schlechter Programmierstil.

Ich hoffe ich hab mich verständlich ausgedrückt und es kann mir jemand einen Tipp geben wie ich mein Problem lösen kann (gerne auch mit prototype)?

Viele Grüße
Heph

  1. hallo,

    Auf dem Dokument ist ein onClick-Handler

    Igitt. Wische dein Dokument bitte mit einem ganz vorsichtig mit Wasser und einem Reinigungsmittel angefeuchteten Tuch ab. Derzeit sind leider noch keine spezifisch gegen solche Schädlinge wirksamen umweltfreundlichen Antihandler bekannt.

    ich nutze bei verschiedenen Objekten onmousedown/onmouseup um die Elemente zu verschieben.

    Schön für dich. Um das nachvollziehen zu können, solltest du aber bitte entweder einen Link zu einer Seite mit deiner Technik angeben oder den wirklich relevanten Code mitposten.

    Wenn ich das Element vom Verschieben los lasse soll das Kontextmenü z.B. nicht aufgerufen werden.

    Stattdessen soll dann was passieren?

    Natürlich wäre es möglich einen Eventhandler zu schreiben der die events verteilt.

    Sehr gut. Dann mach das mal.

    wenn der mouseup nicht an der gleichen Stelle wie der mousedown ist wird das event click nicht ausgelöst.

    Wird "er" (/sie/es) auch nicht.

    außerdem ist das denke ich ziemlich schlechter Programmierstil.

    Nicht unbedingt. Es ist lediglich ziemlich schlechter Erklärungsstil.

    Ich hoffe ich hab mich verständlich ausgedrückt

    Nein, hast du nicht.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hi,
      danke für die Antwort.

      Ich hoffe ich hab mich verständlich ausgedrückt

      Nein, hast du nicht.

      Hm ok, dann versuch ich es nochmal. Das Ganze ist derzeit nur ein Entwurf, es gibt also noch keinen Code. Aber hier mal als Beispiel:
      http://w3studi.informatik.uni-stuttgart.de/~bischobn/beispiel_drag_and_drop.htm

      bei einem Linksklick auf das rote div-Element soll sich ein Kontextmenü öffnen (hier der alert).
      Dieses wird jetzt aber auch geöffnet wenn ich das Element beim Verschieben am Ende los lasse (mouseup). Das will ich verhindern. Hier soll also verhindert werden dass das onclick Event ausgelöst wird ohne den onclick-handler zu verändern.

      wenn der mouseup nicht an der gleichen Stelle wie der mousedown ist wird das event click nicht ausgelöst.

      Wird "er" (/sie/es) auch nicht.

      Nach meinen Tests denke ich doch. onclick wird ausgelöst wenn sich der Cursor zwischen mousedown und up immer über dem selben Objekt befunden hat was hier der Fall ist.

      Natürlich wäre es möglich einen Eventhandler zu schreiben der die events verteilt.
      Sehr gut. Dann mach das mal.

      Soetwas will ich ja gerade nicht. Die Funktionalität Kontextmenü und Drag and Drop sollen unabhängig voneinander bleiben. Ich will die Funktionen einzeln einbinden können oder auch beide gemeinsam. Vielleicht habt ich das jetzt wieder nicht vernünftig erklärt, ich denke das ist aber auch nicht wichtig. Ziel ist einfach wie oben beschrieben das Auslösen des onclick-events zu verhindern, da ich den onclick-Handler nicht verändern kann weil er von einer anderen Funktion, hier dem Kontextmenü gesetzt wird.

      Viele Grüße
      Heph

      1. Natürlich wäre es möglich einen Eventhandler zu schreiben der die events verteilt.
        Sehr gut. Dann mach das mal.
        Soetwas will ich ja gerade nicht. Die Funktionalität Kontextmenü und Drag and Drop sollen unabhängig voneinander bleiben. Ich will die Funktionen einzeln einbinden können oder auch beide gemeinsam. Vielleicht habt ich das jetzt wieder nicht vernünftig erklärt, ich denke das ist aber auch nicht wichtig. Ziel ist einfach wie oben beschrieben das Auslösen des onclick-events zu verhindern, da ich den onclick-Handler nicht verändern kann weil er von einer anderen Funktion, hier dem Kontextmenü gesetzt wird.

        Ich kann Dir jetzt keine genaue Lösung nennen, weil ich mit solchen Probleme nicht täglich zu tun habe. Um die Uhrzeit werde ich auch nicht mehr in der Literatur nachschauen. Deswegen nur ein paar Anregungen, in welcher Richtung Du selber suchen mußt. Mit Event-Capturing den Event abfangen. MS und Netscape/ Firefox hatten früher unterschiedliche Modelle (MS: Bubble-Up), wie es heute im IE läuft, weiß ich nicht, vermute aber, er hat immer noch seine eigene Event-Capturing-Methode. Wie auch immer, in der Capture-Funktion eine Verzweigung auf Mouse-Move, dort kein Weiterleiten des Klicks, sonst das normale Event-Handling für Klick ablaufen lassen. Auch wenn das jetzt nicht 100%ig stimmt, müßtest Du damit weitere Infos finden können.

      2. hallo,

        bei einem Linksklick auf das rote div-Element soll sich ein Kontextmenü öffnen (hier der alert).

        Tut es aber nicht. Jedenfalls nicht zuverlässig. Bei gedrückter Maustaste kann man das rote Dingens verschieben - und wenn man es dabei _unter_ das grüne schiebt und die Maus wieder losläßt, passiert gar nix.

        Dieses wird jetzt aber auch geöffnet wenn ich das Element beim Verschieben am Ende los lasse (mouseup).

        Tut es nicht immer.

        Das will ich verhindern.

        Ich verstehe nicht, warum du etwas verhindern willst, was sowieso nicht zuverlässig passiert. Das einzige, was zuverlässig passiert: wenn ich die Maustaste gedrückt halte, kann ich das rote Viereck verschieben - das grüne übrigens auch. Ist ja auch ein netter Effekt.

        Die Funktionalität Kontextmenü und Drag and Drop sollen unabhängig voneinander bleiben.

        Achso. Das war nicht ganz deutlich bisher.

        Vielleicht habt ich das jetzt wieder nicht vernünftig erklärt

        Doch, jetzt wird es deutlicher - auch wenn sich der Sinn der ganzen Übung an deinem Beispiel noch nicht ganz erschließt.

        Ziel ist einfach wie oben beschrieben das Auslösen des onclick-events zu verhindern, da ich den onclick-Handler nicht verändern kann weil er von einer anderen Funktion, hier dem Kontextmenü gesetzt wird.

        Ich fürchte, da geht bei dir irgendwas im Verständnis der EventHandler noch ein wenig durcheinander. "onclick" ist - stark vereinfachend ausgedrückt (und in dieser Formulierung diskussionswürdig) - sowas wie eine "Zusammenfassung" anderer EventHandler. Mache dir einfach klar, was passiert, wenn ein "Benutzer" seine Maus bedient. Drückt er die Taste (egal, welche), gibt es "onmousedown". Das kannst du ausnutzen. Läßt er die Taste aber wieder los (was unweigerlich irgendwann passieren muß), gibt es "onmouseup". Beides zusammen ist halt "onclick"; wie gesagt, ich vereinfache hier sehr stark.

        Was folgt für deine Programmlogik daraus?

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
      3. Moin!

        bei einem Linksklick auf das rote div-Element soll sich ein Kontextmenü öffnen (hier der alert).
        Dieses wird jetzt aber auch geöffnet wenn ich das Element beim Verschieben am Ende los lasse (mouseup). Das will ich verhindern. Hier soll also verhindert werden dass das onclick Event ausgelöst wird ohne den onclick-handler zu verändern.

        Du willst nicht das onclick-Event verhindern, du willst auf das onclick-Event basierend auf vorangegangenen User-Aktionen unterschiedlich reagieren.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
      4. danke für Eure Antworten!

        Den Fall dass man das eine unter das andere schiebt hatte ich mir noch nicht überlegt, da muss ich mir evt. nochmal Gedanken machen.

        Auch wenn das jetzt nicht 100%ig stimmt, müßtest Du damit weitere Infos finden können.

        Hab mir jetzt ein paar Sachen dazu durchgelesen und ich denke damit bekomme ich es hin.
        In Prototype gibt es bereits diese Funktion:
          stop: function(event) {ChristophChristoph Schnauß Schnauß
            if (event.preventDefault) {
              event.preventDefault();
              event.stopPropagation();
            } else {
              event.returnValue = false;
              event.cancelBubble = true;
            }
          }
        Ich denke das ist genau das was Du beschrieben hast Gerhard.
        Damit ist es dann wirklich recht einfach:
        Beim mousedown: weiterleiten=true;
        Beim mousemove: weiterleiten=false.
        Für den onclick auf das Element dann noch sowas: if (! weiterleiten) Event.stop(e); (wobei e hier das onclick-Event ist)
        Habs getestet und so funktioniert es.

        Da wie Christoph Schnauß schreibt der click nur eine Zusammenfassung des down und up ist denke ich ist meine Lösung den click zumindest nicht an Objekte höherer Ebene weiterzugeben schon ganz ok.
        Viele Grüße
        Heph