Как мне остановить распространение событий, щелкнув правой кнопкой мыши по маркеру листовки?


9

Я не нашел события щелчка правой кнопкой мыши в маркерах Leaflet, поэтому я начал слушать событие mousedown. В методе, который разрешает это событие, я проверяю

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

Это работает при том, что do_something () вызывается, но событие распространяется на карту, и отображается контекстное меню. Как я могу предотвратить распространение события на карту?

Это работает во всех основных (то есть IE) браузерах?

Ответы:


4

Мой первый ответ, по-видимому, не работал, и сейчас я сталкиваюсь с той же проблемой. Вот новый подход:

Leaflet поддерживает событие под названием contextmenu. Как можно найти в документации к Leaflet здесь .

Срабатывает, когда пользователь нажимает правую кнопку мыши на карте, предотвращает показ контекстного меню браузера по умолчанию, если есть слушатели по этому событию.

Так что теоретически код

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

должно работать просто отлично. Но, видимо, реализация отстает от документации. В настоящее время (листовка 0.4.5) contextmenuсобытие, по- видимому , не все еще поддерживается на маркеры, хотя он отлично работает на объектах полилинии.

Похоже, что работа над этой функцией в ближайшем будущем ведется (см. Обсуждения здесь и здесь ). Так что, я думаю, мы можем только надеяться, что Leaflet быстро поработает над этим и включит событие в следующем выпуске ...

Изменить: Не обращайте внимания на то, что я сказал о ожидании реализации. Если вы загрузите последнюю ветку разработки и создадите листовку самостоятельно, вы получите полную поддержку contextmenuсобытий на маркерах. Удачного кодирования.


4

Предотвращение поведения по умолчанию в IE и всех других браузерах:

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

Это не похоже на работу. Вы проверяли это в Leaflet? И является ли ваше событие листовым событием или оригинальным DOMMouseEvent, запущенным браузером?
Mrg

Это для события DOM. Если Leaflet переносит события, используйте event.originalEvent.
tmcw

4

Попробуйте эту внутреннюю функцию:

L.DomEvent.stopPropagation(event);

Это должно сделать свое дело.

PS Я никогда не обнаруживал это ни в одной документации, но видел, что это используется в патче. Используйте на свой риск. ;)

Изменить: я также нашел эту внутреннюю функцию

L.DomEvent.preventDefault(event);

Который, кажется, очень похож на event.preventDefault()JQuery.


Я использовал ваш фрагмент, но то же самое происходит с решением tmcw. Я щелкаю правой кнопкой мыши свой маркер. Это касается метода прослушивания. Там он удаляет маркер (это то, что должен сделать для меня щелчок правой кнопкой мыши), а затем на карте открывается контекстное меню, где я щелкаю, как будто весь маркер не произошел.
mrg

Случайно я только что нашел это L.DomEvent.preventDefault(event);. Из того, что я видел (глядя на источник Leaflet.js), это должно быть очень похоже на то, что preventDefault()предоставляет jQuery ... Попробуйте! :)
Fgysin восстановить Монику

Я попробовал это, но стандартное контекстное меню, которое я получаю в FF, когда я щелкаю правой кнопкой мыши на HTML-странице, продолжает появляться.
mrg

2

Я случайно нашел решение для остановки мероприятия.

Например, если событие создается следующим образом - map.on("click", onMapClick);событие может быть остановлено с помощью этого кода -map.off("click", onMapClick);

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.