13

我在开发的网站上使用Google Maps API v3。我在地图下方有一个下拉框,允许用户在地图上显示不同套标记之间切换。每个标记都使用marker.setMap()显示。Google Maps API v3:是否有setMap()事件的回调或事件侦听器?

我的问题是,地图有时需要很长时间才能显示新的标记,尤其是在IE中。我想在地图切换标记时显示“加载”动画。但我不知道如何检测地图何时完成显示新数据(没有页面加载,因为这是所有的AJAX)。是否有setMap()事件的回调函数或事件监听器,所以我可以调用一个函数在最后一个标记加载完成时停止“加载”动画?

回答

21

似乎没有setMap()的回调或事件监听器,但我想出了一种方法来完成我想要的。我使用jQuery加载Google Map。这是我的代码。

初始化地图时,我为'空闲'事件设置了一个侦听器,隐藏了“加载”动画。每当地图完成滚动或缩放变化后重绘时,会触发“空闲”事件:

google.maps.event.addListener(this.map, 'idle', function() { 
$('#loading').hide(); 
}); 

在我的函数来清除覆盖,我第一次显示加载动画,然后使用的setMap清除每个标记(空)。然后,我通过以.000000001改变经度而非常轻微地重新定位地图。这发生在所有setMap()调用之后,并触发隐藏加载动画的'idle'事件。

// clear overlays from the map 
function clearOverlays() { 
$('#loading').show(); 

// clear the markers from the active data array 
if (activeData) { 
    for (i in activeData) { activeData[i].setMap(null); } 
} 
activeData = ''; 

// very slightly recenter the map to trigger the 'idle' event 
var centerlat = MYMAP.map.getCenter().lat(); 
var centerlng = MYMAP.map.getCenter().lng() + .000000001; 
recenter = new google.maps.LatLng(centerlat, centerlng); 
MYMAP.map.setCenter(recenter); 
} 

这是一个黑客,但我希望别人认为这有用。

+2

是的,我发现这个有用 – 2011-08-27 06:26:24

+1

我试图similir的事情来实现。我在“空闲”开始时创建预加载器,然后渲染标记群集器,并且当所有群集和市场都设置为映射时,我隐藏预加载器。但它没有按预期工作。 Preloader没有显示(在DOM中是的,但是很快就消失了,而不是CSS)。你的黑客拯救了我的一天。 – exoslav 2017-06-09 16:47:11