我正在尝试在循环中向标记添加侦听器,但它不起作用。
单独添加时,它可以正常工作。像这样:
google.maps.event.addListener(markersArr[0], 'click', function() {
infoWindowArr[0].disableAutoPan=true;
infoWindowArr[0].open(map,markersArr[0]);
});
google.maps.event.addListener(markersArr[1], 'click', function() {
infoWindowArr[1].disableAutoPan=true;
infoWindowArr[1].open(map,markersArr[1]);
});
但是当在循环中添加时,单击标记不会弹出infoWindow。
for (var u=0; u<2; u++){
google.maps.event.addListener(markersArr[u], 'click', function() {
infoWindowArr[u].disableAutoPan=true;
infoWindowArr[u].open(map,markersArr[u]);
});
任何人都可以解释如何让它在循环中运作吗?
答案 0 :(得分:2)
您的问题是侦听器函数引用了在外部作用域中定义的u
变量,并在函数外部进行了更改,即在侦听器运行时,它将看到u == 2
,因为循环已经完成。
您可以将侦听器包装在另一个闭包中:
function makeListener(index) {
return function() {
infoWindowArr[index].disableAutoPan=true;
infoWindowArr[index].open(map,markersArr[index]);
}
}
for (var u=0; u<2; u++){
google.maps.event.addListener(markersArr[u], 'click', makeListener(u));
}
答案 1 :(得分:1)
我had the same situation and Engineer answered with an anonymous function wrapper。它看起来像这样。它比创建辅助功能更紧凑但可读性更低。
for (var u=0; u<2; u++){
(function(u) {
google.maps.event.addListener(markersArr[u], 'click', function() {
infoWindowArr[u].disableAutoPan=true;
infoWindowArr[u].open(map,markersArr[u]);
});
})(u);
}