2013-09-04 38 views
9

Trong một trong các dự án của chúng tôi, chúng tôi đang sử dụng Leaflet cùng với plugin Leaflet.markercluster. Nhìn qua các nguồn của Leaflet tôi thấy rằng nó gắn thêm chức năng _collapse() vào sự kiện click của bản đồ, vì vậy bất cứ khi nào tôi nhấp vào bản đồ, nó hợp đồng cụm mở rộng trước đó.
Bây giờ, tôi muốn tắt hành vi này. Nếu cụm được mở rộng, sau đó tôi chỉ muốn bỏ chọn tất cả các điểm đánh dấu của nó trên sự kiện click (và không tự ký hợp đồng cụm). Dưới đây là đoạn mã của tôi:Dừng tuyên truyền sự kiện 'nhấp' trong Tờ rơi

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

Tôi cố gắng thêm những dòng sau vào cuối một dòng callback này để ngăn chặn lan truyền của click sự kiện:

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);

Và không hoạt động nào trong số đó hoạt động. Trình nghe mặc định ẩn bên trong các nguồn Leaflet giữ lời gọi của nó bất cứ khi nào tôi nhấp vào bản đồ. Tui bỏ lỡ điều gì vậy?

+0

Bạn đã tìm thấy một giải pháp này cuối cùng? –

Trả lời

0

Cuối cùng, tôi đã giải quyết được sự cố bằng cách xóa thủ công trình xử lý mặc định click được gọi theo phương thức _collapse(), theo như tôi nhớ. Bẩn, nhưng nó đã làm các trick.

0

Bạn phải sử dụng như thế này event.stopPropagation()

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

Hãy thử bất cứ ai trong này

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

+0

Tôi đã thử tất cả chúng - không may mắn. 'L.DomEvent.preventDefault (e)' và 'L.DomEvent.stopPropagation (e)' gọi 'e.preventDefault()' và 'e.stopPropagation()' tương ứng. – aga

+0

Bạn đã thử câu trả lời của riêng mình chưa? –

15

Tôi biết rằng câu trả lời này là khá muộn , nhưng nếu ai đó quan tâm đến một giải pháp, đây là cách tôi đã giải quyết nó.

Đoạn mã này ở đây bên dưới là ví dụ về ràng buộc hàm với sự kiện click.

map.on('click', doSomething); 

Trên thực tế, sau khi kiểm tra leaflet's API và một số lỗi geekish, có vẻ như sự kiện này trả về một đối tượng, không phải là sự kiện riêng của mình. Bản thân sự kiện được bao bọc vào một trường trong đối tượng được trả về.

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

Khi sử dụng đoạn mã trên, bong bóng sự kiện đã dừng, thứ tôi muốn và có thể là những gì bạn muốn.

1

Bạn không thể ghi đè tuyên truyền sự kiện từ trình xử lý sự kiện. Bạn cần sử dụng trình trợ giúp Leaflet dựng sẵn sau khi trang đã tải, như sau:

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

    L.DomEvent.disableClickPropagation(el); 
Các vấn đề liên quan