对于每个标记,我都有一个单击侦听器,称为函数displayInfo(自定义infoBox)。

google.maps.event.addListener(markers[i], 'click', function() {
        //stop updating markers
         google.maps.event.removeListener(updateMarkersProcess);

        //call display custom infowindow function
        displayInfo(this);
    });


我的地图上有一个bounds_change侦听器,用于将自定义信息框“绑定”到标记。像这样:

function displayInfo(marker) {

 var e = $('infobox');

overlay.getPanes().floatPane.appendChild(e);

displayInfoProcess = google.maps.event.addListener(map, 'bounds_changed', function() {

    show('infobox');

    var markerOffset = overlay.getProjection().fromLatLngToDivPixel(marker.position);

    e.style.top = markerOffset.y + 20 + 'px';
    e.style.left = markerOffset.x - 40 + 'px';

    e.innerHTML = marker.store + '<br><em>' + convertDistance(marker.distance);

});
map.panTo(marker.position);
}


然后,我在地图上有一个单击侦听器,以隐藏infoBox并停止bounds_change侦听器...

[此处删除侦听器代码]

google.maps.event.addListener(map, 'click', function() {

       google.maps.event.removeListener(displayInfoProcess);
       // google.maps.event.clearListeners(map, 'bounds_changed');
       hide('infobox');

    });


这隐藏了infoBox,但事实是,这似乎并未删除侦听器。这是日志中的打印内容:

//点击标记之前(无监听器)


  displayInfoProcess
  空值


//点击标记后(一个监听器)


  displayInfoProcess
  上
  b:qh
  d:“ bounds_changed”
  e:函数(){
  id:1480
  j:空
  l:0
  原型:Ue


//点击地图后(仍然是听众)


  displayInfoProcess
  上
  b:空
  d:“ bounds_changed”
  e:空
  id:1480
  j:空
  l:0
  原型:Ue


而且让事情真的很奇怪,如果我..

1)单击一个标记,这将显示infoBox1

2)单击另一个标记这将显示infoBox2而不是1

3)单击地图,这隐藏了infoBox2

4)平移地图

..来自FIRST标记的infoBox(1)出现了!

有补救办法吗?

最佳答案

监听器引用将被删除(查看b:e:属性,它们都为null),剩下的只是一个shell。如果您在尝试平移地图时未将监听器移除,它将立即回到添加该监听器的标记。

由于您似乎对displayInfoProcess事件所做的一切都显示了信息框,因此我将使用google.maps.event.addListenerOnce(),这将在执行侦听器后立即将其删除。

function displayInfo(marker) {
    google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
        //set infobox info...
    });
    map.panTo(marker.position);
}


我个人不喜欢在地图上使用click事件。当用户单击地图时,他们通常试图平移地图,因此我改用dragstartdragdragend事件。通过使用dragstart事件,您无需在平移地图前释放鼠标键。

这是使用addListenerOncedragstart的示例:http://jsfiddle.net/bryan_weaver/vPN7R/

09-25 16:58