从服务器检索信息后,在谷歌地图上openinfowindowhtml

时间:2009-09-18 11:41:18

标签: javascript google-maps

我的网站上有谷歌地图 并附加到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?

3 个答案:

答案 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而不是标记底部相同的位置。