GMaps APIv3 InfoWindow for循环for()中的标记始终是相同的

时间:2013-07-21 14:49:38

标签: google-maps google-maps-api-3 for-loop google-maps-markers infowindow

我知道这个话题已经多次讨论过,但我无法解决我的问题。 我想在我的地图上显示一些标记,每个标记都有一个点击事件。每个click事件都应该打开一个包含一些数据的infoWindow。

这是我写的;此代码在控制台中运行时没有任何错误,所有标记都正确显示,但点击时显示的信息窗口总是相同的...

//Global variable
var info = new google.maps.InfoWindow();

//... some other functions

function createMarker(map)
{
    for(i = 0 ; i < loadedMarkers.length ; i++) { 
        (function(i) {
            value = loadedMarkers[i];
            var pos = new google.maps.LatLng(value.Latitude, value.Longitude);

            var mapOptions = {
                zoom: 10,
                center: pos,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }

            var marker = new google.maps.Marker({
                position: pos,
                map: map,
                title: value.Title
            });

            var MarkerContent = "<div class=\"marker\">" +
                                    "<h2>"+ value.Title +"</h2>" +
                                    "<p>"+ value.Text +"</p>" +
                                "</div>";

            info.setOptions({
                content: MarkerContent,
                size: new google.maps.Size(50, 50),
                position: pos
            });

            google.maps.event.addListener(marker, 'click', function () {
                info.open(map, marker);
            }); 
         }
       )(i);
    }
}

我听说过一些闭包问题(我是JS的新手),所以我试着将逻辑放在(function(i)...)中,但它总是为所有infowindow显示相同的内容。

有人能解释我哪里错了(为什么?)

非常感谢你

1 个答案:

答案 0 :(得分:3)

您需要在打开时更新infowindow中的内容(否则显示最后的内容):

    google.maps.event.addListener(marker, 'click', function () {
        info.setOptions({
            content: MarkerContent
        });
        info.open(map, marker);
    });