2

我有一个包含多个标记的谷歌地图,每个标记都有它自己的infowindow。在循环中创建标记 - Infowindow在点击内部时不会打开

当我点击时没有任何反应。 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函数中。我想这是谷歌地图不喜欢的东西,但萤火虫给我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属性)

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

+0

这对我来说今天在与OP相同的情况下工作。谢谢Tomas(Y) –

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]); 
       }); 
相关问题