【问题标题】:google maps api v3 zoom_changed event fired twice after fitBounds calledgoogle maps api v3 zoom_changed 事件在调用 fitBounds 后触发了两次
【发布时间】:2013-12-07 00:56:26
【问题描述】:

我正在开发一个与谷歌地图集成的网络应用程序,但在调用 fitBounds 后两次触发 zoom_changed 事件时遇到问题。我必须 fitBounds 的唯一参考是在 updateMap 中。我唯一附加事件侦听器的时间是在 createMap 中。

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

我已经读过这篇文章了:Do not fire 'zoom_changed' event when calling fitBounds function on map

该标志在 first 事件中运行良好。但是为什么会触发另一个 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--;
    }
}

【问题讨论】:

  • 你能给我们一个演示/页面链接吗?
  • 不幸的是我不能。该项目仍在开发中。我目前的理论是,我们可能已经将两个点击处理程序附加到显示地图的链接上。如果事实并非如此,那么我不知道它是什么,除了 fitBounds 真的会触发两个事件。
  • 有同样的问题。这是我想出来的。 fitBounds() 试图适应地图视口中的给定边界。它还会相应地更改地图的缩放级别。当边界彼此相距很远时,fitBounds() 无法设置缩放级别,因为它低于最小缩放限制。所以它将缩放级别设置为零。这会导致zoom_changed 触发两次。

标签: javascript google-maps events google-maps-api-3


【解决方案1】:

我不能告诉你第二个zoom_changed-even 是在哪里触发的(我敢肯定fitBounds() 的单个调用不是原因)

但我建议不要使用这些计数器,而是删除 updateMap() 开头的 zoom_changed-listener 并在 updateMap() 末尾重新分配侦听器

【讨论】:

  • 这就是我最终所做的,它解决了问题,但它似乎是解决这个问题的错误方法...... :(
猜你喜欢
  • 2013-08-25
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2015-09-08
  • 2013-11-05
  • 2012-08-15
  • 2011-01-27
相关资源
最近更新 更多