Javascript 在循环中创建标记-在单击侦听器中时,信息窗口不会打开

Javascript 在循环中创建标记-在单击侦听器中时,信息窗口不会打开,javascript,google-maps,google-maps-api-3,google-maps-markers,Javascript,Google Maps,Google Maps Api 3,Google Maps Markers,我有一个带有多个标记的谷歌地图,每个标记都有自己的信息窗口 当我点击时什么也没发生。仅供参考:我知道听众会发出警报,因为我之前确实在那里发出了警报,而且有效 问题代码是: google.maps.event.addListener(point[i], 'click', function() { infowindow[i] = new google.maps.InfoWindow({content: contentString[i] }); infowindow[i].open

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

当我点击时什么也没发生。仅供参考:我知道听众会发出警报,因为我之前确实在那里发出了警报,而且有效

问题代码是:

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函数中。我猜谷歌地图不喜欢某些东西,但firebug给了我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]);
                });

这是因为您可能在循环中有闭包!因此,回调中的变量
i
在调用回调时已被覆盖。您有两种方法来修复它:

1) 经典的“循环中的闭包”解决方案(您为每个循环迭代执行另一个闭包):

(i=0;i<20;i++){(函数(i)的
{
google.maps.event.addListener(点[i],'click',函数(){
infowindow[i]=新的google.maps.infowindow({content:contentString[i]});
信息窗口[i]。打开(地图,点[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);
    });
}
(i=0;i<20;i++)的
{
点[i].i=i;
google.maps.event.addListener(点[i],'click',函数(){
this.myinfowindow=new google.maps.InfoWindow({content:contentString[this.i]});
this.myinfowindow.open(map,this);
});
}
(或者您也可以将contentString移动到标记:
点[i]。contentString=…
并在单击处理程序中使用
this.contentString
。这样您就不需要
点[i].i
属性。)


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

今晚,在与OP相同的情况下,这对我来说很有效。谢谢Tomas(Y)
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);
    });
}