【问题标题】:How to properly dispatch event for Openlayer 3 map?如何正确调度 Openlayer 3 地图的事件?
【发布时间】:2016-06-02 12:16:35
【问题描述】:

我有一张地图,上面有一些叠加层(带有文本内容的 DIV)。我为地图注册了“点击”事件,例如:

map.on('click', function(evt) { 
    var click_coordinates = evt.coordinate;
});

在用户单击叠加层之前,它可以正常工作。在这种情况下,事件可能会被 Overlay 捕获,但不会传播到地图。在某些情况下可以,但有时我需要由地图处理事件。因此,我在 Overlay 上捕获了 click 事件,并尝试通过

将其发送到地图元素
map.dispatchEvent("click");

好消息是,地图上的事件被触发了,不幸的是它是“不同的”对象,而不是原来的对象,因为它不包含“坐标”属性和其他 Openlayers 的东西。有没有办法,如何以与自然点击地图相同的方式调度事件?

【问题讨论】:

    标签: javascript events click openlayers-3 dispatch


    【解决方案1】:

    您可以通过以下方式实现:

    // content is ol.Overlay#element therefore a DOM element
    content.addEventListener('click', function(evt){
      map.dispatchEvent(evt);
    });
    
    map.on('click', function(evt){
      var pixel = [evt.clientX, evt.clientY];
      var coord = map.getCoordinateFromPixel(pixel);
    
      console.info('event', evt);
      console.info('pixel', pixel);
      console.info('coord', coord);
    });
    

    或者简单地说:

    content.addEventListener('click', function(evt){
      var pixel = [evt.clientX, evt.clientY];
      var coord = map.getCoordinateFromPixel(pixel);
    
      console.info('event', evt);
      console.info('pixel', pixel);
      console.info('coord', coord);
    });
    

    【讨论】:

    • 可能,我错过了重点,但这会给我标准事件对象而不是 OL 甚至对象(例如缺少 evt.coordinate)。这意味着不能使用相同的过程来处理地图点击和对象点击,或者在传递给 map.click 过程之前必须预先转换对象点击事件(例如 var coord = map.getCoordinateFromPixel(pixel) 以获取坐标) .这就是为什么我要问“如何以与自然点击地图相同的方式调度事件”,因为我确实相信 OL 有一种自然的方式来做到这一点。
    • 那你的答案是不,没办法
    • 在我的回答中,我说“你可以实现 ...”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多