在循环中创建标记 - 在单击侦听器内时,Infowindow不会打开

时间:2011-11-30 12:09:34

标签: javascript google-maps google-maps-api-3 google-maps-markers

我有一个带有多个标记的谷歌地图,每个都有自己的信息窗口。

点击后没有任何反应。 fyi:我知道听众开火了,因为我之前确实发出了警报并且有效。

问题代码是:

google.maps.event.addListener(point[i], 'click', function() {
     infowindow[i] = new google.maps.InfoWindow({content: contentString[i] });
     infowindow[i].open(map,point[i]);
});

如果我只做

     infowindow[i] = new google.maps.InfoWindow({content: contentString[i] });
     infowindow[i].open(map,point[i]);

它有效。但不是在我的addListener函数中。我猜这是googlemaps不喜欢的东西,但是firebug给了我0个错误..

真的需要你的帮助。非常感谢!

2 个答案:

答案 0 :(得分:4)

这是因为你可能在循环中有闭包!因此,在调用回调时,回调中的变量i已被覆盖。您有两种选择如何解决它:

1)经典的“闭环循环”解决方法(你为每个循环迭代做另一个闭包):

for (i = 0; i < 20; i++) { (function  (i) {
    google.maps.event.addListener(point[i], 'click', function() {
         infowindow[i] = new google.maps.InfoWindow({content: contentString[i] });
         infowindow[i].open(map,point[i]);
    });
})(i);
}

2)避免关闭并使用标记数据结构:

for (i = 0; i < 20; i++) {
    point[i].i = i;
    google.maps.event.addListener(point[i], 'click', function() {
         this.myinfowindow = new google.maps.InfoWindow({content: contentString[this.i] });
         this.myinfowindow.open(map, this);
    });
}

(或者您也可以将contentString也移动到标记:point[i].contentString = ...并在点击处理程序中使用this.contentString。然后您不需要point[i].i属性。)

就个人而言,我更喜欢第二种解决方案,因为闭包消耗了内存等。

答案 1 :(得分:0)

我遇到了同样的问题,并且它与循环有关,因为当我使用这样的硬编码值时,它们可以工作:

                // Add infowindow
                google.maps.event.addListener(markers[0], 'click', function() {
                  infowindows[0].open(map,markers[0]);
                });
                // Add infowindow
                google.maps.event.addListener(markers[1], 'click', function() {
                  infowindows[1].open(map,markers[1]);
                });