【问题标题】:User vs. System events in Google Maps API v3Google Maps API v3 中的用户与系统事件
【发布时间】:2012-02-15 13:45:59
【问题描述】:
我一直在阅读 Google Maps API 文档,看看是否可以区分系统事件和用户事件?
例如,zoom_changed 事件会在您使用 setZoom、fitBounds 等方法时触发,这在我的实现中是令人讨厌的,因为我只想知道用户何时实际更改缩放级别。
很遗憾,click 事件仅在地图本身而非控件上触发,因此您不能依靠该方法来帮助检测用户输入。
想法?
【问题讨论】:
标签:
google-maps
google-maps-api-3
【解决方案1】:
您也可以考虑我在this Stack Overflow answer 中提出的替代解决方案,它不依赖鼠标事件来识别用户发起的更改。
每当使用setZoom 或fitBounds 启动程序更改时,不要尝试识别用户事件,而是向地图添加一个标志。
map.systemChange = true
map.setZoom()
然后检查(并重置)事件侦听器中的标志。
map.addListener('zoom_changed', function () {
if (map.systemChange) {
map.systemChange = false // Reset the flag for a system-initiated event
} else {
// Handle the user-initiated event
}
});
【解决方案2】:
虽然我无法使用 Google Maps API 解决此问题,但我创建了一个解决方法,其中涉及在无需用户交互的情况下更改地图缩放或定位之前调用此方法:
MapGraph.prototype.systemMove = function() {
var _this = this;
this.isMoving = true;
return setTimeout(function() {
return _this.isMoving = false;
}, 500);
};
我的事件绑定如下所示:
google.maps.event.addListener(this.map, 'dragend', function(event) {
if (!_this.isMoving) return _this.mapChanged();
});
不完美,但确实有效。
希望看到任何其他实现。