我正在使用Google Maps的API。我有一系列标记和一组信息窗口,我试图在单击标记时显示相应的信息窗口。我无法理解如何添加我的事件监听器,以便它尊重JavaScript闭包。
(不正确)代码,所有这些代码都包含在页面加载时调用的initialize()中:
var markers = []
var infoWindows = []
[define all markers and info windows here, long so cut]
for (var i = 0; i < markers.length; i++)
{
google.maps.event.addListener(markers[i], 'click', function() {
infoWindows[i].open(mymap, markers[i]);
});
}
我确保在来到这里之前我的所有物品都已正确初始化。
我对我的问题的理解是,当click事件发生时,infoWindows [i]不再可访问。我能做些什么来使eventListener按照我认为应该的方式工作,其中数组中第i个位置的infoWindow对应于第i个位置的标记?
谢谢。
答案 0 :(得分:1)
您说得对,infoWindows[i]
已无法访问,因为i
的值已更新。
解决此问题的一种方法是使用.forEach
:
markers.forEach(function(value, i){
google.maps.event.addListener(markers[i], 'click', function() {
infoWindows[i].open(mymap, markers[i]);
});
})
在这种情况下,每个事件侦听器的i变量都在不同的函数中。您当前的代码每次都使用相同的i
变量,并且每个事件侦听器中的i
变量都是相同的。在分配了所有事件监听器后,i
保持最终值,markers[i]
指的是列表中的最后一个标记。
查看this question以获取替代解决方案。