Javascript 如何为列表中的每个标记创建单独的侦听器

Javascript 如何为列表中的每个标记创建单独的侦听器,javascript,google-maps,Javascript,Google Maps,我有一个坐标表,我用它在地图上设置标记。标记仅以小于12倍的放大率出现在地图上。我想在单击标记时,执行一些函数,并且只执行一次 下面是它现在是如何发生的: for (let i = 0; i < locationsCoordinates.length; i++) { const bridge = locationsCoordinates[i]; markers.push( new google.maps.Marker({ position: bridge[1

我有一个坐标表,我用它在地图上设置标记。标记仅以小于12倍的放大率出现在地图上。我想在单击标记时,执行一些函数,并且只执行一次

下面是它现在是如何发生的:

for (let i = 0; i < locationsCoordinates.length; i++) {
    const bridge = locationsCoordinates[i];
    markers.push( new google.maps.Marker({
        position: bridge[1],
        title: bridge[0],
        map,
        icon: 'img/bridges.png',
        clickable: true,
    }));
}

google.maps.event.addListener(map, 'zoom_changed', function() {
    let zoom = map.getZoom();
    if (zoom < 12) {
        for (let i = 0; i < markers.length; i++) {
            markers[i].setVisible(false);
            markers[i].addListener("click", function (event) {
                test +=1;
            });
            }
        }
     else {
        for (let i = 0; i < markers.length; i++) {
            markers[i].setVisible(true);
        }
    }
})
for(设i=0;i
问题是,对于这样的代码,当您单击任何标记时,函数会运行多次。
请帮我解决这个问题,你需要使用和重构一下你的代码。像这样的

var locationsCoordinates = [{lat: 12.84, lng: 122.89}, {lat: 12.80, lng: 122.93}, {lat: 12.74, lng: 122.85}];

var markers = [];

for (let i = 0; i < locationsCoordinates.length; i++) {
    var marker = new google.maps.Marker({
        position: locationsCoordinates[i],
        map
    });
    
    google.maps.event.addListenerOnce(marker, "click", () => {
        console.log("marker", i, "clicked");
    });
    
    markers.push(marker);
}

google.maps.event.addListener(map, 'zoom_changed', function() {
    let zoom = map.getZoom();
    if (zoom < 12) {
        for (let i = 0; i < markers.length; i++) {
            markers[i].setVisible(false);
        }
    } else {
        for (let i = 0; i < markers.length; i++) {
            markers[i].setVisible(true);
        }
    }
})
var-locationsCoordinates=[{lat:12.84,lng:122.89},{lat:12.80,lng:122.93},{lat:12.74,lng:122.85}];
var标记=[];
for(设i=0;i{
log(“marker”,i,“clicked”);
});
标记器。推(标记器);
}
google.maps.event.addListener(映射'zoom_changed',函数(){
让zoom=map.getZoom();
如果(缩放<12){
for(设i=0;i
相关问题:

创建标记时,将侦听器添加到标记,如相关示例所示。不在地图上的事件侦听器中

不确定为什么在标记隐藏(
.setVisible(false)
case)时添加侦听器,而不是在标记显示时添加侦听器,但是如果在创建标记时将侦听器添加到标记,则无需执行任何特殊操作

相关问题使用函数闭包将标记与其
InfoWindow
内容关联(或单击标记时要执行的任何操作),下面的代码使用
let
关键字,这是该问题的现代解决方案,但也可以使用函数闭包,尤其是当您需要支持较旧的浏览器时

  for (let i = 0; i < locationsCoordinates.length; i++) {
    const bridge = locationsCoordinates[i];
    let marker = new google.maps.Marker({
      position: bridge[1],
      title: bridge[0],
      map,
      icon: 'img/bridges.png',
      clickable: true,
    });
    markers.push(marker);
    google.maps.event.addListener(marker, 'click', function(evt) {
      infowindow.setContent(locationsCoordinates[i][0]);
      infowindow.open(map, marker);
      test += 1;
    });
  }
  google.maps.event.addListener(map, 'zoom_changed', function() {
    let zoom = map.getZoom();
    if (zoom < 12) {
      for (let i = 0; i < markers.length; i++) {
        markers[i].setVisible(false);
      }
    } else {
      for (let i = 0; i < markers.length; i++) {
        markers[i].setVisible(true);
      }
    }
  })

复杂标记图标