Як зупинити поширення події правою кнопкою миші на маркері Leaflet?


9

Я не знайшов події правої клацання в маркерах Leaflet, тому я почав слухати подію в mousedown. У способі, який вирішує цю подію, я перевіряю

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

Це працює в тому, що виклик do_something () викликається, але подія поширюється на карту і відображається контекстне меню. Як запобігти поширенню події на карту?

Чи працює це у всіх основних (тобто IE) браузерах?

Відповіді:


4

Моя перша відповідь, мабуть, не працювала, і я зараз стикаюся з тією ж проблемою. Ось новий підхід:

Листовка підтримує подію під назвою contextmenu. Як видно з документації про події Leaflet тут .

Запускається, коли користувач натискає праву кнопку миші на карті, не дозволяє контекстному меню браузера за замовчуванням показувати, чи є слухачі на цій події.

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

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

повинен працювати просто чудово. Але, мабуть, реалізація відстає від документації. На сьогодні (Leaflet 0.4.5) contextmenuподія, очевидно, ще не підтримується на маркерах, хоча вона ідеально працює на полілінійних об'єктах.

Здається, в процесі роботи є робота над тим, щоб цю функцію можна було найближчим часом (див. Дискусії тут і тут ). Отже, я думаю, ми можемо просто сподіватися, що Leaflet працює над цим швидко і дозволяє подію в наступному випуску ...

Редагувати: ігноруйте те, що я сказав про очікування реалізації. Якщо ви скачаєте останню галузь майстра розробки та самостійно створюєте листівку, ви отримаєте повну підтримку contextmenuподій на маркерах. Щасливе кодування.


4

Запобігання поведінці за замовчуванням в IE та всіх інших браузерах:

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

Це, здається, не працює. Ви перевірили це в Leaflet? А ваша подія - це подія листівки або оригінальний DOMMouseEvent, який випускається браузером?
мр

Це для події DOM. Якщо Leaflet завершує події, використовуйте event.originalEvent.
tmcw

4

Спробуйте цю внутрішню функцію:

L.DomEvent.stopPropagation(event);

Слід зробити трюк.

PS Я жодного разу не знаходив цього в жодній документації, але бачив, що він використовується в патчі. Використовуйте на свій страх і ризик. ;)

Редагувати: Я також знайшов цю внутрішню функцію

L.DomEvent.preventDefault(event);

Що, здається, дуже те саме, event.preventDefault()що є в jQuery.


Я використовував ваш фрагмент, але те, що трапляється, те саме, що і з рішенням tmcw. Я клацніть правою кнопкою миші маркером. Це переходить до методу прослуховування. Там він видаляє маркер (саме це має робити правий клацання для мене), а потім на карті відкривається контекстне меню, де я натискав так, ніби вся справа з маркером не відбулася.
мр

Випадково я щойно це знайшов L.DomEvent.preventDefault(event);. З того, що я бачив (дивлячись на джерело Leaflet.js), це має бути дуже схожим на те, яке preventDefault()надає jQuery ... Спробуйте! :)
fgysin відновила Моніку

Я спробував це, але в стандартному контекстументі я потрапляю у FF, коли я клацну правою кнопкою миші на html-сторінці, постійно з'являється.
мр

2

Я отримав рішення випадково для зупинки події.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.