Wie stoppe ich die Ereignisausbreitung mit einem Rechtsklick auf den Merkblattmarker?


9

Ich habe in Leaflet-Markern kein Rechtsklick-Ereignis gefunden, also habe ich angefangen, das Mousedown-Ereignis anzuhören. In der Methode, die dieses Ereignis löst, überprüfe ich

if (event.originalEvent.button == 2) {
    do_something();
    // now i want to stop propagation of the rightclick
    return;
}

Dies funktioniert, indem do_something () aufgerufen wird, das Ereignis jedoch auf die Karte übertragen wird und ein Kontextmenü angezeigt wird. Wie verhindere ich, dass sich das Ereignis auf die Karte ausbreitet?

Funktioniert dies in allen gängigen Browsern (dh IE)?

Antworten:


4

Meine erste Antwort hat anscheinend nicht funktioniert und ich stehe jetzt vor dem gleichen Problem. Hier ist ein neuer Ansatz:

Die Broschüre unterstützt ein Ereignis namens contextmenu. Wie in der Leaflet-Ereignisdokumentation hier zu finden .

Wird ausgelöst, wenn der Benutzer die rechte Maustaste auf der Karte drückt, wird verhindert , dass das Standard-Browser-Kontextmenü angezeigt wird, wenn sich Listener für dieses Ereignis befinden.

Also theoretisch der Code

marker.on('contextmenu', function(e) {
  this.openPopup();
});

sollte gut funktionieren. Aber offenbar hinkt die Umsetzung hinter der Dokumentation. Ab sofort (Faltblatt 0.4.5) wird das contextmenuEreignis auf Markern anscheinend noch nicht unterstützt, obwohl es auf Polylinienobjekten einwandfrei funktioniert.

Es scheint Arbeit in der Pipeline zu sein, um diese Funktion in naher Zukunft zu aktivieren (siehe Diskussionen hier und hier ). Ich denke, wir können nur hoffen, dass Leaflet schnell daran arbeitet und das Event in der nächsten Version aktiviert ...

Bearbeiten: Ignorieren Sie, was ich über das Warten auf die Implementierung gesagt habe. Wenn Sie den neuesten Entwicklungs-Master-Zweig herunterladen und selbst eine Broschüre erstellen, erhalten Sie volle Unterstützung für contextmenuEreignisse auf Markern. Viel Spaß beim Codieren.


4

Verhindern des Standardverhaltens im IE und in allen anderen Browsern:

event.returnValue = false;
if (event.preventDefault) event.preventDefault();

Es scheint nicht zu funktionieren. Haben Sie dies in der Broschüre getestet? Und ist Ihre Veranstaltung eine Broschüre oder das ursprüngliche DOMMouseEvent, das vom Browser ausgelöst wurde?
Mrg

Dies ist für ein DOM-Ereignis. Wenn Leaflet Ereignisse umschließt, verwenden Sie event.originalEvent.
tmcw

4

Versuchen Sie diese interne Funktion:

L.DomEvent.stopPropagation(event);

Es sollte den Trick machen.

PS Ich habe das in keiner Dokumentation gefunden, aber ich habe gesehen, dass es in einem Patch verwendet wird. Benutzung auf eigene Gefahr. ;)

Edit: Ich habe auch diese interne Funktion gefunden

L.DomEvent.preventDefault(event);

Das scheint sehr ähnlich zu sein wie event.preventDefault()in jQuery.


Ich habe Ihr Snippet verwendet, aber was passiert, ist dasselbe wie bei der Lösung von tmcw. Ich klicke mit der rechten Maustaste auf meinen Marker. Es geht um die Hörmethode. Dort wird die Markierung entfernt (das sollte ein Rechtsklick für mich tun) und dann wird ein Kontextmenü auf der Karte geöffnet, auf das ich geklickt habe, als ob die gesamte Markierungssache nicht passiert wäre.
Herr

Durch Zufall habe ich das gerade gefunden L.DomEvent.preventDefault(event);. Nach dem, was ich gesehen habe (siehe die Leaflet.js-Quelle), sollte dies dem preventDefault()von jQuery bereitgestellten sehr ähnlich sein ... Probieren Sie es aus! :)
Fgysin wieder Monica

Ich habe es versucht, aber das Standard-Kontextmenü, das ich in FF bekomme, wenn ich mit der rechten Maustaste auf eine HTML-Seite klicke, taucht immer wieder auf.
Mrg

2

Ich habe übrigens eine Lösung zum Stoppen des Ereignisses.

Wenn beispielsweise ein Ereignis wie folgt erstellt wird map.on("click", onMapClick);, kann das Ereignis mit diesem Code gestoppt werden.map.off("click", onMapClick);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.