谷歌地图infowindow弹出窗口不加载动态内容

时间:2013-01-03 13:06:57

标签: google-maps infowindow

请帮我解决这个问题。我有以下代码与工作地址变量。我尝试向Infowindow添加标题,以便当用户点击地图上的标记以查看弹出窗口中的某些内容时。不幸的是,对于所有弹出窗口,我可以看到相同的标题。我测试过,它是一个正确的js数组,但只显示来自数组的第一个标题..请帮助解决这个问题..提前谢谢你们!

<script type="text/javascript" charset="utf-8">    
var map;
var address = < ? php echo json_encode($adr); ? > ;
var titles = < ? php echo json_encode($ttl); ? > ;
var x = 0;
var nbAddresses = address.length;
var geocoder;
var mark;
var contentString = titles[x];

function init() {
    var moptions = {
        zoom: 10,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map"), moptions);
    geocoder = new google.maps.Geocoder();
    for (var i = 0; i < nbAddresses; i++) {
        geocoder.geocode({
            'address': address[i]
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                mark = new google.maps.Marker({
                    position: results[0].geometry.location,
                    map: map,
                    title: titles[x]
                });
                map.setCenter(results[0].geometry.location);
                x++;
                setInfoWindow();
            }
        });
    }

    function setInfoWindow() {
        google.maps.event.addListener(mark, 'click', function(event) {
            var iwindow = new google.maps.InfoWindow();
            iwindow.setContent(contentString);
            iwindow.open(map, this);
        });
    }
}
window.onload = init;
</script>    

2 个答案:

答案 0 :(得分:0)

改变
    X ++;
    setInfoWindow();到

setInfoWindow();
x++;   
sets the problem !

答案 1 :(得分:0)

在程序开始时,将contentString设置为标题数组中的第一个元素

var contentString = titles[x];

然后在setInfoWindow函数中使用此变量不变。

如果您将setInfoWindow更改为接受如此

的contentString参数,该怎么办?
function setInfoWindow(contentString) {...

当你调用setInfoWindow时,传入标题。

setInfoWindow(title[x]);

确保在调用此函数后递增x,因此将x ++移到setInfoWindow调用之下。

编辑您还会不时发现一个奇怪的问题,其中某些标题可能出现在错误的标记上。这是因为您一次执行多个地理编码,并且可能无法获得响应。

以下修改将解决这个问题。

for (var i = 0; i < nbAddresses; i++) {
    geocoder.geocode({
        'address': address[i]
    }, return function(x) {  // we define a function and call it straight away. The function returns another function which is our callback.
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                mark = new google.maps.Marker({
                    position: results[0].geometry.location,
                    map: map,
                    title: titles[x]
                });
                map.setCenter(results[0].geometry.location);
                setInfoWindow();
             }
         }
    }(i)); // (i) after the function declaration calls the function and passes in the current value of i
}

所以基本上我们在这里做的是定义一个函数并直接运行它,当前传入的值为'i'。然后函数将返回另一个函数。一旦goecoding完成,将运行此功能。但是现在我们在定义函数时引用了'i'。所以你不再需要在这个函数之外保留x的记录,因为x将等于i,它对应于传入地理编码器的地址。

这称为闭包。 How do JavaScript closures work?