我该如何重构addEventListener
How should I restructure my addEventListener?
我正在使用谷歌地图的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
像我认为的那样工作,在数组中第I个位置的infoWindow
对应于第I个位置的标记?
你是对的,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]
指向列表中的最后一个标记。
查看这个问题的其他解决方案
相关文章:
- JSON重构(合并内容)与javascript
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 如何“;过滤器”;或者以其他方式重构该数据
- jQuery:重构为函数
- 重构查找函数
- 重构DRY代码的Node.JS回调
- 如何在Angularjs中重构闭包中的重复代码
- 在JavaScript中重构上个月的第一天和最后一天的代码(node.js)
- 重构 jQuery in JS 问题
- 将ECMAScript 6析构函数赋值(ES2015)重构为旧版本的javascript
- 这个字符串拆分器可以重构或改进吗
- 在不重构Mongo数据库的情况下,更新嵌入数组中的具有给定ID的对象
- 我可以用javascript中的switch或case语句重构if-else吗
- 有没有一个好的框架或方法来重构JavaScript对象
- 如果我需要限制它的执行速度,如何重构此代码
- 重构 DOM 搜索方法
- 在jquery中重构“停止运行此脚本?”错误
- Javascript重构通常称为函数
- 如何在我编写的JavaScript中重构Ruby的#{}方法
- 如何重构“;回调金字塔”;转换为基于承诺的版本