我正在创建一个加载&基于边界框和缩放级别销毁标记。我有一个真正的问题,正确删除标记,它似乎有时适用于某些情况。
我有一个包含标记信息的对象,该信息还包含google地图标记对象。我的代码检测是否应根据边界框或缩放级别删除市场。我将标记对象设置为“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);
};
我在控制台中添加了一些调试,转到地图的一个简单区域,只有2个标记http://www.trailforks.com/map/test.php?lat=49.43210641783767&lon=-123.49878636730955&z=14
我可以看到创建的标记,然后稍微移动地图,看到标记没有被重新创建,因为它们是在标记对象中检测到的。然后我移动视口,使其中一个标记离开屏幕,我可以看到标记被删除,标记对象长度更新。但是,如果我将地图平移回标记仍然在地图上。
答案 0 :(得分:3)
我一直在努力解决类似的问题,直到我意识到地图标记的setMap-method是异步的。当你调用它并立即删除对该标记对象的任何引用时,浏览器的垃圾收集器会介入并从内存中清除它,从而阻止实际的删除操作发生。
通过使用splice调用注释掉该行来尝试一下,看看是否有帮助。如果确实有帮助,您应该考虑延迟删除对象,或者将引用存储到标记对象,直到它被真正删除。如何检测它是否真的被删除了?我不知道。
我希望这有帮助!
答案 1 :(得分: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
将其更改为:
编辑,(评论后):
为防止事件处理程序的多个实例同时发生,可以使用全局变量,如下所示:
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
这应该包括两种情况。就像现在一样,有两个不同的事件监听器,AJAX调用可能会有冲突,你可能会在第一个调用完成之前触发第二个调用。