如何知道用户是否更改缩放(Google Maps V3)

时间:2016-07-18 16:46:46

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

我正在使用Google地图和Angularjs开发应用。我有这个代码来控制缩放是否改变

google.maps.event.addListener(map, 'zoom_changed', function(){

  });

问题是,我只有在用户更改缩放时才需要执行此事件。我的代码中还有一个fitBounds()也可以更改缩放。

var latlngbounds = new google.maps.LatLngBounds();
  for (var i = 0; i < latlng.length; i++) {
    latlngbounds.extend(latlng[i]);
  }

  map.fitBounds(latlngbounds);

是否可以选择区分用户操作?

2 个答案:

答案 0 :(得分:0)

好的,我找到了方法

google.maps.event.addListenerOnce(map, 'mousemove', function(){

    google.maps.event.addListener(map, 'zoom_changed', function(){

    });

  });

首先,它检测鼠标是否移动,然后检测缩放是否改变并且正常工作!

答案 1 :(得分:0)

在一般情况下,当前接受的解决方案可能无法正确解决此问题。转到interactive demo,以获取Google Maps API文档中的地图UI事件。请注意,如果将光标放在地图上并用鼠标的滚轮滚动,则不会触发mousedrag事件,因为鼠标保持静止。

当前解决方案假定在mouseover事件之后不会进行程序化地图更新,这对于原始发布者的应用程序可能是正确的,但在更通用的应用程序中可能不是正确的。

我在下面提出了替代解决方案。

首先,无论您以何种方式在代码中以编程方式更新地图,都应在地图上设置自定义属性(我们将其称为systemZoomChange),以指示更改是通过编程方式发起的。

var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < latlng.length; i++) {
  latlngbounds.extend(latlng[i]);
}

map.systemZoomChange = true
map.fitBounds(latlngbounds);

然后在任何事件侦听器上,添加对自定义systemZoomChange属性的检查,并在被标记时将其重置,以避免对系统事件起作用。

map.addListener('zoom_changed', function () {
  if (map.systemZoomChange) {
    map.systemZoomChange = false  // Reset the flag for a system-initiated event
  } else {
    // Handle the user-initiated event
  }
});