Google地图双击事件传播

时间:2013-06-28 21:06:05

标签: javascript google-maps-api-3 event-handling mouseevent event-propagation

  

这个问题经常被问到,但从来没有真正回答过。让我们看看我们是否可以补救它!

事件传播

Google 允许您使用API通过event handlers绑定Google地图视图中的活动。

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

  

嗯,我可以处理这个事件,以便我的代码运行,但是阻止事件继续并启动Google的事件处理程序吗?

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

看一下这段代码

在这里,我将事件处理程序绑定到双击Google Map:

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对象。

这不起作用。事件冒泡,地图放大。我不知道为什么。

  

你问,你看过文件了吗?

事实上。 documentation表示要使用event.stop();

我看过别人说的话。 This issue正是我的问题。它被标记为已修复,但解决方案不起作用。

想法?

解决方法

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

使用disableDoubleClickZoom参数执行此操作。请参阅文档here

以下是一些禁用的代码:

map.set("disableDoubleClickZoom", true);

现在重新启用:

map.set("disableDoubleClickZoom", false);

当然,您可以在MapOptions参数中设置属性,以便首先创建map对象。

2 个答案:

答案 0 :(得分: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();
});

This answer让我走上正轨!

答案 1 :(得分:0)

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

event.stopPropagation()不是这类问题的普遍灵丹妙药,原因有两个:

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

对于这两种情况,解决方法几乎无疑可用,但可能需要Google Maps的“内部知识”才能解决。

也许别人比我更了解。