【问题标题】:Leaflet User Triggered Events传单用户触发事件
【发布时间】:2018-01-23 12:44:25
【问题描述】:

有什么方法可以确定事件是由编程触发还是由用户触发?

我们想在地图移动或缩放时重新加载标记列表,但我们最初使用setBounds() (http://leafletjs.com/reference.html#rectangle-setbounds) 设置地图的边界,这也会触发moveend (http://leafletjs.com/reference.html#map-moveend) 和@ 987654326@ (http://leafletjs.com/reference.html#map-zoomend) 事件导致标记重新加载两次。

【问题讨论】:

  • 对不起,混淆了,删除我以前的答案并发布一个新的。

标签: leaflet


【解决方案1】:

似乎有一个名为hard 的事件对象上的(未记录的)属性在地图被setBounds 移动时被设置,而在用户拖动地图或使用光标时不会被设置:

map.on('moveend', function (e) {
    if (e.hard) {
        // moved by bounds
    } else {
       // moved by drag/keyboard
    }
});

Plunker 上的测试用例:http://plnkr.co/edit/SloKuB?p=preview

作为另一种选择,您可以在设置边界后绑定到事件,这样当您设置边界时它不会触发,当您之后确实想设置边界时,您可以先使用 .off 取消绑定并再次重新绑定使用.on 设置后。类似(未经测试/hacky):

function moveEndHandler () {
    ....
}

map.on('moveend', moveEndHandler);

function mySetBounds (bounds) {
    map.off('moveEnd', moveEndHandler);
    map.setBounds(bounds);
    map.on('moveend', moveEndHandler);
}

【讨论】:

  • 是的!我们也这么说,看起来它只适用于 moveend 而不是 zoomend 或 dragend。我们正在合并所有这些来确定是否重新加载标记。
  • 在我的回答中添加了另一个选项有点骇人听闻,但也可以解决问题
  • 与 map.setBounds() 和 map.fitBounds() 不同,map.setView() 默认不会导致在事件上设置硬属性。使用选项 {reset: true} 设置硬属性。
  • 不幸的是,在传单版本 1.6.0 中,e 对象看起来完全不同,没有这样的属性(硬)。有谁知道检测运动是程序化的还是由用户做出的任何其他方法?谢谢x
猜你喜欢
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多