为什么我的谷歌地图事件监听器不能正常工作

why are my google maps event listeners not working properly?

本文关键字:常工作 工作 不能 我的 谷歌地图 事件 监听器 为什么      更新时间:2023-09-26

我试图处理每个标记(有30个标记)的监听器上的鼠标,并显示这些标记的信息窗口。我为每个标记创建了侦听器,但是当我的鼠标在某个标记上时,它总是显示最后一个标记的信息窗口。总而言之,我听不懂其他标记。任何帮助都会很感激。提前感谢,这里是我的代码:

var listeners = [];
for(var i = 0; i < markers.length; i++){
  var marker = markers[i];
  var contentString = contents[i];
  listeners[i] = new google.maps.event.addListener(marker, 'mouseover', function() {
    var hideInfoWindows = function(){
        for (var j = 0; j < util.Common.infowindows.length; j++) {
          util.Common.infowindows[j].close(); 
        }
    }
    var addInfoWindow = function(){
        var infowindow = new google.maps.InfoWindow({
            content: contentString
        });
        //hideInfoWindows();
        util.Common.infowindows.push(infowindow);
        infowindow.open(util.Common.googlemap,marker);
    }
    addInfoWindow();
  });
}

我也在使用js集群库,但我不认为这个问题与它有关。

我认为你的问题可能是你没有在周期内使用闭包,当事件侦听器被触发时,markercontentString变量指向最后一个标记。

试着像这样重写这个循环:

var listeners = [];
for(var i = 0; i < markers.length; i++){
    (function(index){ //create a closure, variable 'index' will take its value from variable i, but won't be affected by changed i in the outer scope
        var marker = markers[index]; //use this scope's index variable instead of i
        var contentString = contents[index]; //use this scope's index variable instead of i
        listeners[index] = new google.maps.event.addListener(marker, 'mouseover', function() {
            var hideInfoWindows = function(){
                for (var j = 0; j < util.Common.infowindows.length; j++) {
                    util.Common.infowindows[j].close();
                }
            };
            var addInfoWindow = function(){
                var infowindow = new google.maps.InfoWindow({
                    content: contentString
                });
                //hideInfoWindows();
                util.Common.infowindows.push(infowindow);
                infowindow.open(util.Common.googlemap,marker);
            };
            addInfoWindow();
        });
    })(i);
}