将侦听器添加到标记在循环中不起作用

Adding listeners to markers doesn't work in a loop

本文关键字:循环 不起作用 侦听器 添加      更新时间:2023-09-26

我正在尝试将侦听器添加到循环中的标记,但它不起作用。

单独添加它们时,它可以工作。喜欢这个:

    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]);
    });

但是在循环中添加时,单击标记不会弹出信息窗口。

        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]);
        });

谁能解释一下如何让它在循环中工作?

您的问题是侦听器函数引用在外部作用域中定义的 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));
}

我也有同样的情况,工程师用匿名函数包装器回答。它看起来像这样。它比创建副功能更紧凑,但可读性较差。

    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);
    }