2009-09-18 48 views
2

信息我有一个谷歌地图在我的网站 ,重视它moveend的事件处理程序openinfowindowhtml在谷歌地图后,从服务器检索

GEvent.addListener(map, "moveend", function() 
    { 
      map.clearovrelays(); 
      GetLayerDataFromServer(); //it set the markers again on the map according the map position 
    }); 

,也是我有事件处理程序点击标记

GEvent.addListener(marker, 'click', function() 
    { 
     marker.openInfoWindowHtml('this is the data'); 
    }); 

我的问题是这样的

当在地图上 上的标记的一个用户按下它打开 openInfoWindowHtml的相关标记。

它也将地图移动到该标记位置。 然后它触发事件

map.moveend 

而且在事件map.moveend我很清楚在地图上 所有的标记,并根据地图新位置重新加载它们。

结果是 当用户点击标记它打开第二他indoWindowHtml ,它会清除地图,再次加载标记, 而不显示点击的标记的indoWindowHtml。

我的问题是我该怎么做才能显示infoWindowHtml?

回答

1

您可以设置一个标志,指示用户是否单击了一个标记并且不清除地图(如果是这种情况)。

var marker_clicked = false; 

GEvent.addListener(map, "moveend", function() 
{ 
    if(!marker_clicked) 
    { 
     map.clearovrelays(); 
     GetLayerDataFromServer(); //it set the markers again on the map acording the map position 
    } 
    marker_clicked = false; 
}); 

GEvent.addListener(marker, 'click', function() 
{ 
    marker_clicked = true; 
    marker.openInfoWindowHtml('this is the data'); 
}); 
+0

确定 但我想,GetLayerDataFromServer 会发生,因为我想要得到的地图新坐标 – avi 2009-09-18 12:16:05

+0

@avi标记:然后将GetLayerDataFromServer()if子句之外。 – NickFitz 2009-09-18 15:33:59

0

一种可能的替代策略是开通{suppressMapPan:真正}您的信息窗口,它告诉地图信息窗口打开时不进行平移。这样,你就知道任何地图移动都是用户真实的地图移动。

注意:{suppressMapPan:true}没有记录,所以它可能会在未来的某个版本中消失。

0

另一种策略是由一个写

GEvent.addListener(marker, 'click', function() 
    { 
     var iwAnchor = marker.getIcon().infoWindowAnchor; 
     var iconAnchor = marker.getIcon().iconAnchor; 
     var offset = new GSize(iwAnchor.x-iconAnchor.x,iwAnchor.y-iconAnchor.y); 
     map.openInfoWindowHtml(marker.getLatLng(),'this is the data',{pixelOffset:offset}); 
    }); 

,然后,而不是调用提供clearOverlays(),通过循环,将标记一个删除它们。

通过在地图上打开infowindow而不是标记,当标记被移除时它不会自动关闭。

infowindow现在是覆盖图,因此clearOverlays会将其删除,因此您无法使用clearOverlays。循环标记并逐个删除它们可能听起来效率不高,但clearOverlays在内部执行的循环非常类似。

上面的iconAnchor计算只需将infowindow放置在与使用marker.openInfowindowHtml而不是标记的底部相同的位置。