我应该如何重构我的addEventListener?

时间:2013-03-20 19:44:00

标签: javascript javascript-events google-maps-api-3 addeventlistener

我正在使用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个位置的标记?

谢谢。

1 个答案:

答案 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以获取替代解决方案。