谷歌地图api v3 zoom_changed事件在fitBounds调用后激发了两次

google maps api v3 zoom_changed event fired twice after fitBounds called

本文关键字:两次 调用 zoom v3 api changed fitBounds 事件 谷歌地图      更新时间:2024-04-24

我正在开发一个与谷歌地图集成的web应用程序,在调用fitBounds后,我遇到了两次zoom_changed事件触发的问题。我对fitBounds的唯一引用是在updateMap中。我唯一一次附加事件侦听器是在createMap中。

对缩放更改处理程序的第二次调用导致另一个触发器更新地图。

我已经读过这篇文章了:不要解雇';zoom_changed';调用地图上的fitBounds函数时发生的事件

该标志在第一个事件中运行良好。但是,为什么会触发另一个zoom_changed事件呢?

更好的是,如何防止第二个zoom_changed事件触发?

以下是我在控制台日志中看到的内容:

updateMap, fitbounds: 0
calling fitbounds...
zoom changed
mapEventHandler, fitbounds: 1
zoom changed
mapEventHandler, fitbounds: 0

这是我的更新地图函数的代码,它调用fitBounds:

var mapZoomOrDragEventInProgress = false;
var fitBoundsCalledCount = 0;
var map = null;
updateMap = function () {
    console.log("updateMap, fitbounds: " + fitBoundsCalledCount);
    var bounds = fitBoundsForVenues();
    deleteAndUpdateMarkers();
    if (!mapZoomOrDragEventInProgress) {
        bn.spg.map.vars.fitBoundsCalledCount++;
        if (markers.length > 1) {
            console.log("calling fitbounds...");
            map.fitBounds(bounds);
        } else {
            console.log("setting zoom...");
            map.setCenter(bounds.getCenter());
            map.setZoom(13);
        }
    }
    mapZoomOrDragEventInProgress = false;
}

这是我的创建地图功能:

createMap = function() {
    if (map === null) {
        var bounds = fitBoundsForVenues();
        var mapOptions = {
            center: bounds.getCenter(),
            zoom: 13,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
        google.maps.event.addListener(map, 'zoom_changed', zoomChangedEventHandler)
        google.maps.event.addListener(map, 'dragend', dragendEventHandler);
     }
}

这是我的事件处理程序:

zoomChangedEventHandler = function () {
    console.log("zoom changed");
    console.log("mapEventHandler, fitbounds: " + fitBoundsCalledCount);
    //we want to handle only user zoom events, NOT zoom_events triggered from fit bounds or set_zoom
    if (fitBoundsCalledCount === 0) {
        mapZoomOrDragEventInProgress = true;
        var coords = getViewportCoordinates();
        updateVenuesAndMapAsync(coords.lat, coords.lng, coords.radius);
    } else {
        fitBoundsCalledCount--;
    }
}

我无法告诉您第二个zoom_changed-甚至是在哪里触发的(我相信fitBounds()的一次调用不是原因)

但是,与其使用这些计数器,我建议删除updateMap()开头的zoom_changed侦听器,并在updateMap() 结束时重新分配侦听器