我有一个带有多个标记的谷歌地图,每个都有自己的信息窗口。
点击后没有任何反应。 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个错误..
真的需要你的帮助。非常感谢!
答案 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]);
});