2013-09-04 2 views
9

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

map.on('click', function(e) { 
    scope.deselectAllMarkers(); 
}); 

Я попытался добавить следующие строки в конце этого один линии обратного вызова для того, чтобы остановить распространение click события:

scope.L.DomEvent.stopPropagation(e);
scope.L.DomEvent.preventDefault(e);
scope.L.DomEvent.stop(e);
scope.L.DomEvent.stopPropagation(e.originalEvent);
scope.L.DomEvent.preventDefault(e.originalEvent);
scope.L.DomEvent.stop(e.originalEvent);

И никто из них не работает. Слушатель по умолчанию, который скрыт внутри источников Leaflet, сохраняет свой вызов, когда я нажимаю на карту. Я что-то упускаю?

+0

Вы нашли решение этой проблемы, в конце концов? –

ответ

0

В конце концов, я решил проблему вручную удалением обработчика по умолчанию click, который, насколько я помню, вызывал метод _collapse(). Грязный, но он сделал трюк.

0

Вы должны использовать как этот event.stopPropagation()

map.on('click', function(e) { //don't forget to pass this 'e' event parameter 
    e.preventDefault(); 
    scope.deselectAllMarkers();   
    e.stopPropagation(); 
    return false;  
}); 

Попробуйте кто-нибудь из этого

1. event.stopPropagation()
2. event.preventDefault()
3. return false

+0

Я пробовал все из них - не повезло. 'L.DomEvent.preventDefault (e)' и 'L.DomEvent.stopPropagation (e)' invoke 'e.preventDefault()' и 'e.stopPropagation()' соответственно. – aga

+0

Вы попробовали свой собственный ответ? –

15

Я знаю, что этот ответ довольно поздно , но если кто-то заинтересован в решении, вот как я его решил.

Этот фрагмент, приведенный ниже, является примером привязки функции к событию click.

map.on('click', doSomething); 

На самом деле, после проверки leaflet's API и некоторые geekish отладки, кажется, что событие возвращает объект, а не само событие. Само событие завернуто в поле внутри возвращаемого объекта.

var doSomething = function(map) { 
    // stop propagation 
    map.originalEvent.preventDefault(); 
}; 

При использовании выше фрагмента кода, пузырение события остановилось, то, что я хотел, и, вероятно, что вы хотели.

1

Вы не можете переопределить распространение события из обработчика событий. Вам нужно использовать встроенный помощник Листовки после загрузки страницы, например:

$('.element').each (i,el)-> 

    L.DomEvent.disableClickPropagation(el);