有没有办法阻止zoom_change事件因fitBounds()而发生?
我遇到一个问题,我需要在地图上进行缩放更改时从客户端搜索服务器,但每次调用fitBounds()时都会导致zoom_change触发,导致客户端再次搜索服务器。我只对用户完成的zoom_change感兴趣,而不是使用fitBounds以编程方式。
答案 0 :(得分:8)
在程序中执行fitBounds时,请设置全局标志。触发zoom_changed事件时,如果设置了标志,请清除它,否则将请求发送到服务器。
答案 1 :(得分:4)
这是一个老问题,但对其他人可能有用。我遇到了同样的问题,每次在向地图添加多个标记时调用zoom_changed
()时都会触发fitBounds
。我做的是在地图完全加载后将监听器添加到map_changed
事件,如下所示:
google.maps.event.addListener(map, 'tilesloaded', function() {
google.maps.event.addListener(map, 'zoom_changed', function() {
答案 2 :(得分:4)
经过许多令人沮丧的时间之后,这是我的解决方案:
var tiles_listener = google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
var zoom_listener = google.maps.event.addListener(map, 'zoom_changed', function() {
reloadMarkers();
});
});
请注意,我正在为addListenerOnce
调用tilesloaded
,以确保zoome_changed
侦听器仅在第一个fitBounds
完成后添加一次。
答案 3 :(得分:1)
通过删除该事件还有另一种方法可以做到这一点。我认为这比添加全局变量更容易,更清晰。
vm.map.events.bounds_changed = function() {
google.map.event.addEventListener(zoom_changed,function(mapper,eventName,args){});
}
另一种方式(忘记添加):
{{1}}
答案 4 :(得分:0)
在我的应用中,我可以通过setZoom()
,fitBounds()
或setOptions()
以编程方式启动缩放更改事件。
MAN = {};
MAN.globalMap = google.maps.Map(document.getElementById('map'));
然后我路由所有程序化调用,通过包装函数设置缩放,将标志翻转到false
,然后再继续设置缩放。
MAN.savedZoom = MAN.globalMap.getZoom();
MAN.saveZoomFlag = true;
// we want it to always be true, unless zoom was
// changed programatically.
MAN.setZoom = function setZoom(zoomLevel) {
console.log("won't save that I'm setting zoomLevel to " + zoomLevel);
this.saveZoomFlag = false;
MAN.globalMap.setZoom(zoomLevel);
};
MAN.fitBounds = function fitBounds(bounds) {
console.log("setting bounds, won't save zoomlevel.");
this.saveZoomFlag = false;
MAN.globalMap.fitBounds(bounds);
};
MAN.setOptions = function setOptions(options) {
console.log("setting options, won't save zoomlevel.");
this.saveZoomFlag = false;
MAN.globalMap.setOptions(options);
};
然后我宣布一个听众。起初我只宣布了第一个,并且感到困惑的是它不起作用:
google.maps.event.addListener(
MAN.globalMap,
'zoom_changed',
function zoom_changed_listener() {
console.log(
"zoom changed to " +
MAN.globalMap.getZoom() + "; " +
(MAN.saveZoomFlag ? "saving." : "not saving.")
);
if (MAN.saveZoomFlag) {
console.trace("saving");
MAN.savedZoom = MAN.globalMap.getZoom();
}
MAN.saveZoomFlag = true;
}
);
您可能还会发现idle
事件有用,但是,如果您只是想避免初始设置。在此处查看有关地图事件的更多信息:https://developers.google.com/maps/documentation/javascript/events
答案 5 :(得分:-3)
我想这应该很简单。有一个变量说
var z = map.getZoom(); //scope this variable appropriately(somewhere before you call the fitbounds()
然后在map.fitbounds()之后立即执行
map.setZoom(z); //this automatically changes the zoom level back to the previous level