Jak zatrzymać propagację zdarzeń za pomocą kliknięcia prawym przyciskiem myszy na znaczniku Ulotki?

9

Nie znalazłem zdarzenia kliknięcia prawym przyciskiem myszy w znacznikach Ulotki, więc zacząłem słuchać wydarzenia mousedown. W metodzie, która rozwiązuje to zdarzenie, sprawdzam

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

Działa to w przypadku wywołania metody do_something (), ale zdarzenie jest propagowane do mapy i wyświetlane jest menu kontekstowe. Jak zapobiec rozprzestrzenianiu się wydarzenia na mapie?

Czy działa to we wszystkich głównych przeglądarkach (tj. IE)?

mrg
źródło

Odpowiedzi:

4

Moja pierwsza odpowiedź najwyraźniej nie zadziałała, a ponieważ mam teraz ten sam problem. Oto nowe podejście:

Ulotka obsługuje wydarzenie o nazwie contextmenu. Jak stwierdzono w dokumentacji wydarzenia Ulotki tutaj .

Uruchamiany, gdy użytkownik naciśnie prawy przycisk myszy na mapie, uniemożliwia wyświetlenie domyślnego menu kontekstowego przeglądarki, jeśli na tym wydarzeniu znajdują się nasłuchiwacze.

Więc teoretycznie kod

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

powinien działać dobrze. Ale najwyraźniej implementacja pozostaje w tyle za dokumentacją. Na razie (ulotka 0.4.5) contextmenuzdarzenie najwyraźniej nie jest jeszcze obsługiwane na znacznikach, chociaż działa idealnie doskonale na obiektach polilinii.

Wydaje się, że trwają prace nad udostępnieniem tej funkcji w najbliższej przyszłości (patrz dyskusje tutaj i tutaj ). Sądzę więc, że możemy mieć tylko nadzieję, że Ulotka szybko nad tym zadziała i umożliwi wydarzenie w następnej wersji ...

Edycja: zignoruj ​​to, co powiedziałem o czekaniu na wdrożenie. Jeśli pobierzesz najnowszą gałąź rozwoju i sam zbudujesz ulotkę, uzyskasz pełne wsparcie dla contextmenuwydarzeń dotyczących markerów. Szczęśliwego kodowania.

fgysin przywraca Monikę
źródło
4

Zapobieganie domyślnemu zachowaniu w IE i wszystkich innych przeglądarkach:

event.returnValue = false;
if (event.preventDefault) event.preventDefault();
tmcw
źródło
Wydaje się, że to nie działa. Czy przetestowałeś to w Ulotce? A czy twoje wydarzenie jest wydarzeniem ulotkowym czy oryginalnym DOMMouseEvent uruchamianym przez przeglądarkę?
mrg
To jest dla zdarzenia DOM. Jeśli ulotka zawija zdarzenia, użyj event.originalEvent.
tmcw
4

Wypróbuj tę funkcję wewnętrzną:

L.DomEvent.stopPropagation(event);

To powinno wystarczyć.

PS Nigdy nie znalazłem tego w żadnej dokumentacji, ale widziałem go używanego w łatce. Używaj na własne ryzyko. ;)

Edycja: Znalazłem również tę funkcję wewnętrzną

L.DomEvent.preventDefault(event);

Który wydaje się być bardzo podobny do tego, event.preventDefault()który znajduje się w jQuery.

fgysin przywraca Monikę
źródło
Użyłem twojego fragmentu kodu, ale to, co się dzieje, jest takie samo, jak w przypadku rozwiązania tmcw. Klikam prawym przyciskiem myszy znacznik. Chodzi o metodę odsłuchu. Tam usuwa znacznik (to powinno zrobić dla mnie prawe kliknięcie), a następnie na mapie otwiera się menu kontekstowe, w którym kliknąłem tak, jakby cała rzecz związana z markerem się nie wydarzyła.
mrg
Przez przypadek właśnie to znalazłem L.DomEvent.preventDefault(event);. Z tego, co widziałem (patrząc na źródło Leaflet.js), powinno to być bardzo podobne do preventDefault()dostarczonego przez jQuery ... Wypróbuj! :)
fgysin przywraca Monikę
Próbowałem, ale standardowe menu kontekstowe pojawia się w FF, gdy klikam prawym przyciskiem myszy na stronie HTML.
mrg
2

Nawiasem mówiąc, mam rozwiązanie problemu zatrzymania zdarzenia.

Na przykład, jeśli zdarzenie jest tworzone w ten sposób - map.on("click", onMapClick);zdarzenie można zatrzymać za pomocą tego kodu -map.off("click", onMapClick);

Alper Necati Akın
źródło