17

这个问题经常被问到,但从来没有真正得到很好的回答。让我们看看我们是否可以解决它!

事件传播

Google允许您使用事件处理程序通过其API绑定到 Google 地图视图中的事件。

有时,您可能会将事件处理程序绑定到 Google本身已经绑定的事件。因此,当您的事件触发并执行您告诉它执行的任何操作时,您可能会发现 Google 同时也在做自己的小事。

嗯,我可以处理事件以便我的代码运行,但阻止事件继续并触发 Google 的事件处理程序吗?

你一定可以!欢迎来到Event Propagation(又名事件冒泡)。

看看这段代码

在这里,我绑定了一个事件处理程序以双击 Google 地图:

var aListener = google.maps.event.addListener(map, 'dblclick', function(event) {
    // Try to prevent event propagation to the map
    event.stop();
    event.cancelBubble = true;
    if (event.stopPropagation) {
        event.stopPropagation();
    }
    if (event.preventDefault) {
        event.preventDefault(); 
    } else {
        event.returnValue = false;  
    }
});

map是要绑定到的 Google Map 对象。

这行不通。事件冒泡,地图放大。我不知道为什么。

你问,你读过文档吗?

的确。文档说要使用event.stop();

我看过其他人在说什么。这个问题正是我的问题。它被标记为已修复,但解决方案不起作用。

想法?

解决方法

doubleclick 事件的一种可能解决方法是在您需要它不触发时禁用 Google 的默认行为,然后稍后重新启用它。

你用这个disableDoubleClickZoom论点来做这件事。请参阅此处的文档。

这是一些要禁用的代码:

map.set("disableDoubleClickZoom", true);

现在重新启用:

map.set("disableDoubleClickZoom", false);

当然,您可以在MapOptions参数中设置map对象何时创建的属性。

4

2 回答 2

3

更新:不幸的是,我不得不发现Firefox不能通过它访问当前事件,window.event因此该代码在那里不起作用。我还没有找到解决方法。


事实证明,对代码的修复是最小的:只需event从事件处理程序函数中删除参数,从而访问window.event处理程序内的全局对象。

以下示例代码适用于 IE 和 Chrome,但不适用于 Firefox

google.maps.event.addListener(map, "dblclick", function(googleMapsEvent) {
    console.debug("caught double click");
    // reference the global event object
    // ignore the googleMapsEvent passed in by Google Maps!
    event.preventDefault();
});

这个答案让我走上了正轨!

于 2015-09-18T11:49:46.317 回答
0

不是解决方案,而是一些想法,应要求...

event.stopPropagation()不是解决此类问题的通用灵丹妙药,原因有两个:

  • 您的事件处理程序可能正在响应已经冒泡的事件,即阻止事件处理(在本例中为缩放)为时已晚,该事件处理在冒泡周期的早期触发。
  • 这可能不是冒泡问题,而是同一级别正在处理的事件。.addListener()实现了观察者模式,这意味着将新添加的内容添加到元素的“具体观察者”队列中,而不会删除先前由相同机制添加的任何处理程序。

对于这两种情况,几乎毫无疑问都有一种解决方法,但可能需要谷歌地图的“内部知识”才能解决。

也许别人比我知道的多。

于 2013-06-28T22:45:28.670 回答