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

creating markers in loop - Infowindow does not open when inside an click Listener

本文关键字:信息窗 信息 窗口 侦听器 创建 循环 单击      更新时间:2023-09-26

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

当我点击时什么也没发生。提示:我知道监听器是否触发,因为我之前确实在它里面放了一个警报,它起作用了。

问题代码是:

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个错误。

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

这是因为你可能在循环中有闭包!因此,在回调调用时,回调中的变量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属性了。)

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

我也有同样的问题,它与循环有关,因为当我使用像这样的硬编码值时,它们确实有效:

                // 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]);
                });