我在http://arquitectospelomundo.com有一个网站,它显示了几个标记,由markerclusterer函数组合在一起,当点击它时会显示一个包含一些信息的信息窗口。直接点击地图时,信息窗口会出现在正确的位置;但是当点击侧边栏(在其中一张图片上)时,信息窗口会超出范围。 这是正常的,突然改变了;我想弄清楚,但到目前为止没有成功。我很感激任何指导我正确方向的帮助。 谢谢。
答案 0 :(得分:1)
因为看起来这个问题与MarkerClusterer有关。
当触发点击的标记位于群集内时,标记的map-property为null,并且您的位置错误。
可能的解决方案:
当标记在群集中时,使用隐藏标记(通过visible
隐藏)作为infoWindow的锚点:
google.maps.event.addListener(marker, 'click', function() {
//create the dummy-marker on first click
if(!map.get('dummy')){
map.set('dummy',new google.maps.Marker({map:map,visible:false}))
}
var latLng = marker.getPosition();
//when the marker is within a cluster
if(!marker.getMap()){
//set position of the dummy
map.get('dummy').setPosition(latLng);
//use dummy as infowindow-anchor
marker= map.get('dummy');
}
map.panTo(latLng);
infowindow.setContent(contentString);
infowindow.open(map,marker);
});
答案 1 :(得分:0)
我遇到了与Marker群集器相同的问题以及对地图的外部点击,打开了infowindows。 @ Dr.Molle使用虚拟标记的解决方案是一个很好的方向,但问题是您可以使用虚拟平移到平移,但是侦听器会触发不在地图上的标记上的单击。正确的infowindow打开,但autopan功能无法知道平移到哪里,所以它保持在最后一次点击后的位置。这是从地图外重复点击的问题。第一次点击没问题,但第二次或第三次点击是错误的,如果是在群集中则依赖于它。
我找到的解决方案是测试标记是否在集群中,如果是,则将其附加到地图上,并在点击后将其删除(不确定是否有必要,可能是为了防止地图变慢)。我把它放在从外面每次点击调用的函数中。但也许你也可以将它构建到事件监听器中。这对我很有用:
function openInfoWindow(id){
googlemap.setZoom(13);
var marker = markers[id];
var latLng = marker.getPosition();
if(!marker.getMap()){ //if the clicked marker is in a cluster, so it is not attached to a map
marker.setMap(googlemap); //attach it to the map
google.maps.event.trigger(marker, 'click'); // the standard trigger, opens infowindow
googlemap.panTo(latLng);
marker.setMap(null); //detach it from the map (not sure if necessary
} else {
google.maps.event.trigger(marker, 'click');
googlemap.panTo(latLng);
}
return false;
}