Google Maps API v3:标记未被删除

Can*_*aka 9 google-maps google-maps-api-3

我正在创建一个基于边界框和缩放级别加载和销毁标记的地图.我有一个真正的问题,正确删除标记,它似乎有时适用于某些情况.

我有一个包含标记信息的对象,它还包含谷歌地图标记对象.我的代码检测是否应根据边界框或缩放级别删除市场.我将标记对象设置为"setMap(null);" 并使用firebug我可以看到它被设置,然后我完全删除父对象,并正确更新对象数据长度.

当一个标记被删除时,我输出到firebug控制台,似乎正在工作,我可以看到标记没有从边界框更改上的标记的ajax调用中重新创建.

然而,如果我在地图上缩放,我有时会看到标记被移除,如果我缩小然后向后平移按住鼠标.或者,如果我第一次缩小,有时会删除所有标记,但如果我再次放大然后退出,则不会删除它们.

我必须对我的代码逻辑做错事,我很难过.

您可以查看http://www.trailforks.com/map/test.php?lat=49.352247&lon=-123.202413 的来源, JS是 http://www.trailforks.com/map/includes/map.js

删除标记的代码位于底部

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);
};
Run Code Online (Sandbox Code Playgroud)

我在控制台中添加了一些调试,只用2个标记进入地图的简单区域http://www.trailforks.com/map/test.php?lat=49.43210641783767&lon=-123.49878636730955&z=14

我可以看到创建的标记,然后稍微移动地图,看到标记没有被重新创建,因为它们是在标记对象中检测到的.然后我移动视口,使其中一个标记离开屏幕,我可以看到标记被删除,标记对象长度更新.但是,如果我将地图平移回标记仍然在地图上.

在此输入图像描述

Mar*_*elo 0

而不是这样做:

 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
Run Code Online (Sandbox Code Playgroud)

将其更改为:

编辑,(评论后):

为了防止事件处理程序的多个实例同时发生,可以使用全局变量,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这应该涵盖这两种情况。现在,使用两个不同的事件侦听器,AJAX 调用可能会发生冲突,并且您可能会在第一个调用完成之前触发第二个调用。