0

我正在使用谷歌地图的 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]);
    });
}

在来到这里之前,我已确保我的所有对象都已正确初始化。

我对我的问题的理解是,当点击事件发生时,infoWindows[i]不再可以访问。我该怎么做才能让eventListener我认为它应该工作,infoWindow数组中第 i 个位置的位置对应于第 i 个位置的标记?

4

1 回答 1

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]引用列表中的最后一个标记。

查看此问题以获取替代解决方案。

于 2013-03-20T20:02:28.857 回答