我的网站上有谷歌地图 并附加到moveend事件处理程序
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?
答案 0 :(得分: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');
});
答案 1 :(得分:0)
一种可能的替代策略是使用{suppressMapPan:true}打开您的信息窗口,告诉地图在infowindow打开时不要平移。这样,您就知道任何地图移动都是用户的真实地图移动。
警告:{suppressMapPan:true}未记录,因此在将来的某个版本中可能会消失。
答案 2 :(得分: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而不是标记底部相同的位置。