当前位置: 首页 > 知识库问答 >
问题:

Google Maps API v3:未删除标记

阮俊弼
2023-03-14

我正在创建一个加载地图

我有一个包含标记信息的对象,它也包含google maps标记对象。我的代码检测是否应根据边界框或缩放级别删除市场。我将marker对象设置为“setMap(null);”使用firebug,我可以看到它被设置了,然后我完全删除了父对象,并且对象数据长度得到了正确更新。

当一个标记被认为删除时,我将其输出到firebug控制台,似乎正在工作,并且我可以看到该标记没有从ajax调用中重新装箱,以便在边界框更改中使用标记。

然而,如果我放大地图,我有时会看到标记正在被删除,如果我放大,然后按住鼠标向后平移。或者有时,如果我第一次缩小,标记将全部删除,但如果我再次放大然后缩小,它们不会被删除。

我的代码逻辑一定出了问题,我被难住了。

您可以查看http://www.trailforks.com/map/test.php?lat=49.352247

删除标记的代码位于底部

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

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

共有2个答案

马亮
2023-03-14

而不是执行以下操作:

 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调用可能会发生冲突,您可能会在第一个调用完成之前触发第二个调用。

蒋骏
2023-03-14

我在类似的问题上挣扎了很长时间,直到我意识到map标记的setMap-method是异步的。当您调用它并立即删除对该标记对象的任何引用时,浏览器的垃圾收集器会介入并从内存中清理它,从而阻止实际的删除操作发生。

尝试一下,只需用拼接调用注释掉该行,看看是否有帮助。如果确实有帮助,您应该考虑延迟删除对象,或者存储对标记对象的引用,直到它真正被删除。如何检测它是否真的被删除?我不知道。

我希望这有帮助!

 类似资料:
  • 接口说明 该接口已经废弃,请使用【单体化、标绘、压平 -> GEOJSON上传】接口 如果出现标记有误或者不想在对某个位置进行标记,可以调用该接口来删除标记的位置 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/marker/1.0.0/del 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id s

  • Quickly removes tag, found by “Match Tag Pair” from current caret position, and adjusts indentation. 快速删除标签,并调整缩进。这里的标签是在插入符所在位置由 匹配标签 功能查找的标签。 <body> <div |class="wrapper"> <h1>Title</h1>

  • 我使用spring Boot2、jpa和Hibernate。Db是后置,我尝试删除一个带有子级的对象 如果我删除了Samplings,Samplings、testsamplings和Compressions也应该被删除。 从sample_letter=?的示例中删除和sampling_id=?和sampling_year=? 2018-10-03 22:21:05.832错误14511--[nio

  • 本文向大家介绍删除“ highcharts.com”徽标,包括了删除“ highcharts.com”徽标的使用技巧和注意事项,需要的朋友参考一下 示例 默认情况下,Highchart在图表的右下角放置一个Credits标签。 可以使用credits图表设置中的选项将其删除。 要么 将删除highcharts.com徽标。

  • Google发布了带有BottomNavigationView的新支持库v25 有什么方法可以去除物品标签吗?

  • 若要删除标签,在tag命令指定 -d选项执行。 $ git tag -d <tagname>