我正在尝试使用google maps api创建动态标记,并且在迭代使用变量tat时遇到问题。
我已经省略了生成标记和地图的代码,因为它似乎工作正常。这是用于生成信息窗口的代码。
此代码产生错误'this_marker_info [$ n]'[undefined]不是对象
for(var $n = 0; $n < business.length; $n++){
google.maps.event.addListener(this_marker[$n], 'click', function() {
this_marker_info[$n].open(map, this_marker[$n]);
});
}
此代码有效
for(var $n = 0; $n < business.length; $n++){
google.maps.event.addListener(this_marker[$n], 'click', function() {
this_marker_info[0].open(map, this_marker[0]);
});
}
我所做的就是在行第二个例子中用数字0交换$ n读取“this_marker_info [$ n] .open(map,this_marker [$ n]);”
任何帮助将不胜感激
答案 0 :(得分:4)
这是典型的关闭问题。
到this_marker_info[$n].open(map, this_marker[$n]);
执行时,您已完成循环,$n
的值为business.length
。
解决方案是编写一个闭包:
for(var $n = 0; $n < business.length; $n++){
(function ($the_actual_n) {
google.maps.event.addListener(this_marker[$the_actual_n], 'click', function() {
this_marker_info[$the_actual_n].open(map, this_marker[$the_actual_n]);
});
}($n)); // <-- call this 'anonymous' function with $n
}
答案 1 :(得分:3)
使用Array.forEach()
是修复它的一种不错的方法:
business.forEach(function(item, $n) {
google.maps.event.addListener(this_marker[$n], 'click', function() {
this_marker_info[$n].open(map, this_marker[$n]);
});
}
这样,包含函数永远不会增加$n
,因此它会可靠地保持原始值。
在旧版浏览器中使用Array.forEach()
see this。