2012-07-20 48 views
9

Tôi đang tạo bản đồ tải & phá hủy các điểm đánh dấu dựa trên cả hộp giới hạn và mức thu phóng. Tôi đang gặp sự cố thực sự khi đánh dấu đúng cách để xóa, có vẻ như đôi khi cũng hoạt động trong một số trường hợp nhất định.API Google Maps v3: Các điểm đánh dấu không bị xóa

Tôi có một đối tượng chứa thông tin điểm đánh dấu, cũng chứa đối tượng điểm đánh dấu bản đồ google. Mã của tôi phát hiện nếu thị trường sẽ bị xóa dựa trên hộp giới hạn hoặc mức thu phóng. Tôi đặt đối tượng điểm đánh dấu là "setMap (null);" và sử dụng firebug tôi có thể thấy rằng nó đang được thiết lập, sau đó tôi loại bỏ các đối tượng cha mẹ hoàn toàn và chiều dài dữ liệu đối tượng được cập nhật đúng cách.

Tôi xuất ra bảng điều khiển Firebug khi đánh dấu được cho là đã bị xóa, có vẻ như đang hoạt động và tôi có thể thấy rằng điểm đánh dấu không được sắp xếp lại từ cuộc gọi ajax cho các điểm đánh dấu trên thay đổi boundingbox.

Tuy nhiên, nếu tôi phóng to xung quanh bản đồ, đôi khi tôi có thể thấy các điểm đánh dấu đang bị xóa, nếu tôi phóng to thì hãy xoay lại giữ chuột. Hoặc đôi khi, tất cả các điểm đánh dấu sẽ bị xóa nếu tôi phóng to lần đầu tiên, nhưng nếu tôi phóng to lại thì chúng sẽ không bị xóa.

Tôi phải làm điều gì đó sai trái với logic của mã của mình, tôi bị bối rối.

Bạn có thể xem là nguồn gốc của http://www.trailforks.com/map/test.php?lat=49.352247&lon=-123.202413 JS là http://www.trailforks.com/map/includes/map.js

mã để xóa một dấu hiệu là ở dưới cùng

function clearMarkerMemory(mapItem, i) { 
    google.maps.event.removeListener(mapItem.lis); // remove stored listener 

    mapper.data[i].obj.setMap(null); // remove marker 
    mapper.data.splice(i, 1); 

    console.log("removed marker "+mapItem.icon+":"+mapItem.nid+' '+mapItem.name); 
}; 

tôi đã thêm một số debug hơn vào ra cửa sổ Console, đi đến một khu vực đơn giản của bản đồ chỉ với 2 điểm đánh dấu http://www.trailforks.com/map/test.php?lat=49.641783767&lon=-123.49878636730955&z=14

Tôi có thể thấy các điểm đánh dấu được tạo, sau đó di chuyển bản đồ ab và thấy rằng các điểm đánh dấu không được tạo lại vì chúng đã được phát hiện trong đối tượng điểm đánh dấu. Sau đó tôi di chuyển khung nhìn để một trong các điểm đánh dấu tắt màn hình và tôi có thể thấy rằng điểm đánh dấu bị xóa và chiều dài đối tượng điểm đánh dấu cập nhật. Nhưng nếu tôi xoay bản đồ trở lại điểm đánh dấu vẫn còn trên bản đồ.

enter image description here

+1

Tôi đang gặp khó khăn khi tạo lại "lỗi" nếu có lỗi thực sự. Đã xem mã của bạn và nó cũng được viết và AFAICS bạn đang làm đúng. Không phải là vấn đề, nhưng bạn đã thử đặt toàn bộ đối tượng 'data [i]' thành 'null' trước khi ghép nó ra khỏi mảng chưa? – dda

+0

+1 cho câu hỏi thông minh, được viết tốt, BTW ... – dda

+0

Để sao chép goto quan điểm này http://www.trailforks.com/map/test.php?lat=49.344530719060245&lon=-123.1294569147949&z=13 sau đó nhấp chuột chuột để tất cả các điểm đánh dấu màu vàng ở bên trái đều tắt màn hình. sau đó kéo bản đồ trở lại theo hướng đó giữ chuột, do đó, cuộc gọi ajax của các điểm đánh dấu chưa kích hoạt, bạn sẽ thấy tất cả các điểm đánh dấu đã bị xóa. Nhưng sau đó phóng to một lần và ra ngoài và thử lại lần nữa và rất có thể sẽ bị hỏng, các điểm đánh dấu sẽ vẫn còn 100% thời gian bây giờ. Mặc dù chúng được loại bỏ khỏi đối tượng mapper.data. – Canadaka

Trả lời

0

Thay vì thực hiện:

google.maps.event.addListener(map, 'dragend', function() { refreshMarkers(); }); //refresh markers when user moves map 
google.maps.event.addListener(map, 'zoom_changed', function() { refreshMarkers(); }); //refresh markers when user moves map 

thay đổi nó để:

EDIT, (sau khi bình luận):

Để ngăn chặn nhiều trường hợp của các xử lý sự kiện xảy ra đồng thời, một biến toàn cầu có thể được sử dụng, như sau:

google.maps.event.addListener(map, 'bounds_changed', function() { 
if (processing) { // var processing is global 
    return; 
} 
processing = true; 
refreshMarkers(); 
processing = false; 

}); //refresh markers when user moves map 

Điều đó phải bao gồm cả hai trường hợp. Hiện tại, với hai trình nghe sự kiện khác nhau, các cuộc gọi AJAX có thể xung đột và bạn có thể thực hiện cuộc gọi thứ hai trước khi cuộc gọi đầu tiên hoàn thành.

+0

vấn đề với việc sử dụng "bounds_changed" là nó bắt đầu gọi một TON của các cuộc gọi ajax cho mỗi chuyển động nhỏ của chuột, điều này có thể bằng hàng trăm khi người dùng cho phép di chuột, "kéo". Nhưng tôi đã thử nó anyway và vấn đề vẫn còn, nếu tôi xoay quanh tải một unch đánh dấu sau đó thu nhỏ, không ai trong số các dấu hiệu được loại bỏ ngay cả với người nghe duy nhất. Tôi cũng đã thử nghiệm với chỉ cho phép kéo hoặc zoom_changed. – Canadaka

+0

Điều đó có thể dễ dàng ngăn chặn với một biến toàn cầu cho biết rằng một sự kiện đang được xử lý. (Xem bản chỉnh sửa để trả lời của tôi). – Marcelo

+0

mã ở trên vẫn không làm việc, nó không bao giờ có vẻ là đúng, và tôi nhận được một giai điệu của POST bị hủy bỏ trong giao diện điều khiển firebug, bản đồ là siêu laggy. Sẽ tốt hơn nếu chỉ có một người nghe, nhưng tôi khá chắc chắn rằng vấn đề của tôi với các điểm đánh dấu không xóa không liên quan đến việc có nhiều người nghe vì tôi có thể gặp vấn đề với chỉ 1 người nghe được bật. – Canadaka

3

Tôi đã vật lộn với vấn đề tương tự trong một thời gian dài cho đến khi tôi nhận ra rằng phương thức setMap của trình đánh dấu bản đồ là không đồng bộ. Khi bạn gọi đó và ngay lập tức loại bỏ bất kỳ tham chiếu đến đối tượng đánh dấu đó, trình thu gom rác của trình duyệt sẽ bước vào và dọn dẹp nó khỏi bộ nhớ và do đó ngăn chặn hoạt động xóa thực tế xảy ra.

Hãy dùng thử bằng cách chỉ nhận xét ra khỏi dòng với cuộc gọi ghép nối và xem điều đó có hữu ích không. Nếu nó trợ giúp, bạn nên cân nhắc việc trì hoãn việc xóa đối tượng, hoặc lưu trữ tham chiếu đến đối tượng điểm đánh dấu thay thế cho đến khi nó thực sự bị xóa. Làm thế nào để phát hiện nếu nó thực sự bị loại bỏ? Tôi không có ý kiến.

Tôi hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan