我有一个简单的问题让我难过:
在Leaflet应用程序中,我有一个用于点击地图上元素的事件监听器:
marker.on('click', function () {
doStuff();
$('element').doStuff();
setView(this.getLatLng());
});
然而,setView方法还会触发一个'地图移动'事件,我不想解雇。使用普通的JavaScript或jQuery,我可以阻止在click事件函数内部触发任何其他事件吗?
编辑:现在用小提琴!要使用它,只需单击地图上的任意位置即可。如您所见,当放置在click事件侦听器中时,e.stopPropagation()不起作用。
答案 0 :(得分:2)
我不相信你可以阻止moveend
被解雇。 (注意:这些不是jQuery事件 - Leaflet有自己的内部事件系统。)这是setView
的来源:
setView: function (center, zoom) {
zoom = zoom === undefined ? this.getZoom() : zoom;
this._resetView(L.latLng(center), this._limitZoom(zoom));
return this;
}
_resetView
总是在最后触发moveend
:
_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
var zoomChanged = (this._zoom !== zoom);
if (!afterZoomAnim) {
this.fire('movestart');
if (zoomChanged) {
this.fire('zoomstart');
}
}
...
this.fire('moveend', {hard: !preserveMapOffset});
}
您可以调查自定义这些功能以允许抑制事件。
<强>更新强>
或者,您可以更改moveend
事件处理程序。让它跟踪一个标志,当你不希望正常的操作发生时,你会设置一个标志。
例如,您已将您的处理程序设置为类似于:
map.on('moveend', myHandler);
让myHandler
做类似的事情:
function myHandler(e) {
if (stopFlag) {
return;
}
else {
// Normal operation
...
}
}
然后启用并禁用stopFlag
来控制流量。这样做的好处是您不必在您的应用程序中发布Leaflet的自定义版本。
答案 1 :(得分:1)
直截了当:这将永远不会奏效。通过使用stopPropagation
/ preventDefault
,您可以阻止click
事件通过dom冒泡。没有其他的。执行L.Map
setView
方法后,它将始终触发moveend
事件,它与click
事件无关。如果您还在movestart
中设置了缩放级别,它还会触发move
和resetview
个事件以及setView
事件。这就是Leaflet的工作方式。您可以随时扩展L.Map
来编写自己的逻辑,但我猜你最好找到解决问题的另一种解决方案。
答案 2 :(得分:0)
使用event.stopPropagation(),see the docs
marker.on('click', function (e) {
e.stopPropagation();
}
答案 3 :(得分:0)
这是我更棘手的解决方案。
将moveend设置为true
作为默认值。
var moveend = true;
将moveend设置为false
。
moveend = false;
map.setView(new L.LatLng(lat, lng));
如果moveend
是true
,请执行一些操作。无论如何,将moveend
设置为true
以便下次运行。
map.on('moveend', (e) => {
if (moveend) {
// Do something if moveend is enabled
}
moveend = true;
});