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