如何右键单击Leaflet标记停止事件传播?


9

我在Leaflet标记中未找到右键单击事件,因此我开始侦听mousedown事件。在解决此事件的方法中,我检查

if (event.originalEvent.button == 2) {
    do_something();
    // now i want to stop propagation of the rightclick
    return;
}

这确实可以通过调用do_something()来实现,但是该事件会传播到地图并显示一个上下文菜单。如何防止事件传播到地图?

这在所有主要(即IE)浏览器中都有效吗?

Answers:


4

我的第一个答案显然是行不通的,因为我现在正面临着同样的问题。这是一种新方法:

Leaflet支持一个名为的事件contextmenu。由于单张事件文档中找到这里

当用户在地图上按下鼠标右键时触发,阻止默认浏览器上下文菜单显示,如果此事件上有侦听器。

所以从理论上讲

marker.on('contextmenu', function(e) {
  this.openPopup();
});

应该工作正常。但是显然实现落后于文档。到目前为止(传单0.4.5),该contextmenu事件显然还不受标记支持,尽管它在折线对象上工作得很好。

似乎正在准备在不久的将来启用此功能(请参见此处此处的讨论)。因此,我想我们只能希望Leaflet能够快速开展这项工作并在下一个版本中启用该事件...

编辑: 忽略我说的有关等待实施的内容。如果您下载最新的开发主分支并自己构建传单,则将获得contextmenu对标记事件的全面支持。快乐的编码。


4

防止IE和所有其他浏览器中的默认行为:

event.returnValue = false;
if (event.preventDefault) event.preventDefault();

它似乎不起作用。您在Leaflet中测试过吗?您的事件是传单事件还是浏览器触发的原始​​DOMMouseEvent?
2012年

这是用于DOM事件。如果Leaflet包装事件,请使用event.originalEvent。
tmcw 2012年

4

试试这个内部函数:

L.DomEvent.stopPropagation(event);

它应该可以解决问题。

PS我从未在任何文档中找到它,但看到它在补丁中使用。使用风险自负。;)

编辑:我也发现了这个内部功能

L.DomEvent.preventDefault(event);

这似乎与event.preventDefault()jQuery 非常相似。


我使用了您的代码段,但是发生的情况与tmcw的解决方案相同。我右键单击我的标记。转到侦听方法。在那里,它删除了标记(这是右键单击应该为我执行的操作),然后在地图上打开了一个上下文菜单,在该菜单上单击了鼠标,好像没有发生整个标记事件一样。
mrg 2012年

我偶然发现了这个L.DomEvent.preventDefault(event);。从我所看到的(查看Leaflet.js源代码)来看,这应该与preventDefault()jQuery提供的内容非常相似...试试吧!:)
fgysin恢复Monica 2012年

我尝试过,但是当我右键单击html页面时,弹出的标准contextmenu一直弹出。
mrg 2012年

2

我偶然遇到了一个停止事件的解决方案。

例如,如果创建了这样map.on("click", onMapClick);的事件- ,则可以使用以下代码停止该事件-map.off("click", onMapClick);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.