在地图上调用fitBounds函数时,不要触发'zoom_changed'事件

时间:2012-10-25 22:08:51

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

有没有办法阻止zoom_change事件因fitBounds()而发生?

我遇到一个问题,我需要在地图上进行缩放更改时从客户端搜索服务器,但每次调用fitBounds()时都会导致zoom_change触发,导致客户端再次搜索服务器。我只对用户完成的zoom_change感兴趣,而不是使用fitBounds以编程方式。

6 个答案:

答案 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