谷歌地图API 3 removeListener不工作/行为怪异

jen*_*irf 0 javascript listener javascript-events google-maps-api-3 google-maps-markers

我有一个点击我的每个标记调用函数displayInfo,自定义信息框的听众..

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

        //call display custom infowindow function
        displayInfo(this);
    });
Run Code Online (Sandbox Code Playgroud)

我的地图上有一个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); 
}
Run Code Online (Sandbox Code Playgroud)

然后我在地图上有一个点击监听器来隐藏infoBox并停止bounds_change监听器......

[删除此处的聆听代码]

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

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

    });
Run Code Online (Sandbox Code Playgroud)

这隐藏了infoBox,但事实是,这似乎并没有删除监听器.这是日志中的打印件:

//在点击标记之前(没有监听器)

displayInfoProcess null

//单击标记(监听器)后

displayInfoProcess Ue b:qh d:"bounds_changed"e:function(){id:1480 j:null l:0 proto:Ue

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

displayInfoProcess Ue b:null d:"bounds_changed"e:null id:1480 j:null l:0 proto:Ue

如果我......让事情变得非常奇怪

1)单击标记 这显示infoBox1

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

3)单击地图 这会隐藏infoBox2

4)平移地图

来自FIRST标记的信息框(1)显示!!

有补救措施吗?

Bry*_*ver 6

正在删除侦听器引用(查看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);
}
Run Code Online (Sandbox Code Playgroud)

我个人不喜欢click在地图上使用这个活动.当用户点击地图上的他们通常试图平移地图,所以我用dragstart,dragdragend事件来代替.通过使用该dragstart事件,您无需在尝试平移地图之前释放鼠标按钮.

以下是使用addListenerOnce和的示例dragstart:http://jsfiddle.net/bryan_weaver/vPN7R/