Javascript 谷歌地图&x27;s双击事件传播

Javascript 谷歌地图&x27;s双击事件传播,javascript,google-maps-api-3,event-handling,mouseevent,event-propagation,Javascript,Google Maps Api 3,Event Handling,Mouseevent,Event Propagation,这个问题经常被问到,但从来没有得到很好的回答。让我们看看能不能补救 事件传播 Google允许您通过使用谷歌地图视图中的事件绑定到事件 有时,您可能会将事件处理程序绑定到Google本身已经绑定到的事件。因此,当您的事件触发并执行您让它执行的任何操作时,您可能会发现谷歌同时也在做自己的小事情 嗯,我可以处理事件以便代码运行,但阻止事件继续并启动Google的事件处理程序吗 你当然可以!欢迎使用事件传播(又称事件冒泡) 看看这个代码 在这里,我绑定了一个事件处理程序来双击Google地图: var

这个问题经常被问到,但从来没有得到很好的回答。让我们看看能不能补救

事件传播 Google允许您通过使用谷歌地图视图中的事件绑定到事件

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

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

你当然可以!欢迎使用
事件传播
(又称事件冒泡)

看看这个代码 在这里,我绑定了一个事件处理程序来双击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
是一个要绑定到的谷歌地图对象

这不管用。事件将出现气泡,贴图将放大。我不知道为什么

你问,你读过文档了吗

的确如此。表示使用
event.stop()

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

想法

变通办法 doubleclick事件的一个可能的解决方法是在需要时禁用Google的默认行为,然后在以后重新启用它

您可以使用
disableDoubleClickZoom
参数执行此操作。请参阅文档

以下是一些要禁用的代码:

map.set("disableDoubleClickZoom", true);
现在重新启用:

map.set("disableDoubleClickZoom", false);

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

不是解决方案,而是一些想法,如有要求

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

  • 您的事件处理程序可能正在响应已冒泡的事件,即阻止冒泡周期早期触发的事件处理(本例中为缩放)为时已晚
  • 它可能不是冒泡问题,而是由同一级别的人员处理的事件
    .addListener()
    实现了一个观察者模式,这意味着新添加的内容将添加到元素的“具体观察者”队列中,而不删除以前由相同机制添加的任何处理程序
对于这两种情况,几乎可以毫无疑问地找到解决办法,但可能需要谷歌地图的“内部知识”才能解决


可能其他人知道的比我多。

更新:不幸的是,我不得不发现Firefox无法通过
窗口访问当前事件。事件
因此此代码在那里不起作用。我还没有找到解决办法


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

以下示例代码在IE和Chrome中适用,但在Firefox中不适用:


把我放在正确的轨道上

哇,代码看起来很可怕。给我一点时间来解决它。我意识到这个问题已经有一年了,但只是删除了这个事件。stop()行为我解决了这个问题。event.stop()抛出了一个TypeError:undefined不是一个函数,它阻止了下面的代码运行。删除它后,单击或双击没有为我传播。对我来说,这是为了防止点击覆盖下的标记,但我用缩放双击测试了它,它也停止了。但对我来说,它似乎不适用于mouseover/mouseout。当鼠标指针位于标记上时,鼠标图标仍会从张开的手变为手指指向。但是点击没有通过。如果您在这个问题上取得了更多进展,请在这里或其他地方自由讨论,然后链接到它。:)没有更多的进展。当我禁用单击传播时,我无法再单击覆盖中的URL。我将我的标记更改为自定义覆盖,这有助于一些(不再需要单击任何标记),但我仍然可以通过覆盖单击现有的POI。真烦人。我会继续尝试,如果我能想出一个解决方案,就在这里发布。谢谢你的投入。目前我正在使用我的变通方法。也许有一天event.stop()会像文档中所说的那样工作。
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();
});