谷歌地图的双击事件传播

Mor*_*789 16 javascript event-handling mouseevent event-propagation google-maps-api-3

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

事件传播

Google允许您使用事件处理程序通过其API绑定到Google Map View中的事件.

有时您可以将事件处理程序绑定到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;  
    }
});
Run Code Online (Sandbox Code Playgroud)

map是一个要绑定的Google Map对象.

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

你问,你读过文件吗?

确实.该文件说,使用event.stop();

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

想法?

解决方法

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

你用这个disableDoubleClickZoom参数做到这一点.请参阅此处的文档.

以下是一些禁用的代码:

map.set("disableDoubleClickZoom", true);
Run Code Online (Sandbox Code Playgroud)

现在重新启用:

map.set("disableDoubleClickZoom", false);
Run Code Online (Sandbox Code Playgroud)

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

Bee*_*oot 0

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

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

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

毫无疑问,这两种情况都可以找到解决方法,但可能需要谷歌地图的“内部知识”才能解决。

也许别人比我知道的更多。

  • 感谢您的意见。目前我只是使用我的解决方法。也许有一天 event.stop() 会像文档中所说的那样工作。 (2认同)