我正在开发一个与谷歌地图集成的Web应用程序,但是在调用fitBounds后,zoom_changed事件会触发两次。我唯一涉及到fitBounds的引用是在updateMap中。我唯一附加事件侦听器的时间是在createMap中。
第二次调用缩放更改处理程序会导致另一个触发更新地图的操作。
我已经阅读了这篇文章:不要在调用地图上的fitBounds函数时触发“zoom_changed”事件,标志对于第一个事件运作正常。但为什么还有另一个zoom_changed事件被触发?
更好的办法是,如何防止第二个zoom_changed事件的触发?
这是我在控制台日志中看到的内容:
第二次调用缩放更改处理程序会导致另一个触发更新地图的操作。
我已经阅读了这篇文章:不要在调用地图上的fitBounds函数时触发“zoom_changed”事件,标志对于第一个事件运作正常。但为什么还有另一个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()
无法设置缩放级别,因为它低于最小缩放限制。所以它将缩放级别设置为零。这会导致zoom_changed
触发两次。 - M Hussain