3

为什么 FramedCloud 弹出窗口会窃取弹出窗口内的点击事件?

current_popup = new OpenLayers.Popup.FramedCloud(
    "featurePopup",
    f.geometry.getBounds().getCenterLonLat(),
    new OpenLayers.Size(0,0),
    "<b>Наблюдения</b><br/>" + $.map(features, function(fe) { return fe.attributes.description; }).join('<br/>'),
    null, false, null);
    map.addPopup(current_popup, true);



$('#map').on('click', function() { console.log('test'); return false; });

始终捕获单击事件,除非我单击弹出窗口内的链接。弹出窗口和锚点是#map.

  • 单击地图 => 触发回调
  • 单击标记 => 触发回调,显示弹出窗口
  • 在弹出窗口内单击(不在链接上)=> 未触发回调
  • 单击弹出窗口中的链接=>以同样的方式,没有任何反应

OL 那部分的代码非常晦涩难懂。

为什么它会在弹出窗口内捕获点击?我该如何把它们带回来?

编辑:在 OL 中进行更深入的调试:此函数被触发:

bindAsEventListener: function(func, object) {
    return function(event) {
        return func.call(object, event || window.event);
    };

event.target是锚,正是我所期望的:

<a class="edit-card-link" href="/form/?id=806">...</a>

func是:

handleBrowserEvent: function(evt) {
    var type = evt.type, listeners = this.listeners[type];
    if (!listeners || listeners.length == 0) {
        return;
    }
    var touches = evt.touches;
    if (touches && touches[0]) {
        var x = 0;
        var y = 0;
        var num = touches.length;
        var touch;
        for (var i = 0; i < num; ++i) {
            touch = touches[i];
            x += touch.clientX;
            y += touch.clientY;
        }
        evt.clientX = x / num;
        evt.clientY = y / num;
    }
    if (this.includeXY) {
        evt.xy = this.getMousePosition(evt);
    }
    this.triggerEvent(type, evt);
}

this是 OpenLayers.Event 类实例,evt.target仍然是那个锚点,listeners包含 1 个侦听器:

function (evt){OpenLayers.Event.stop(evt,true);}

这是原因吗?我怎么把它拿出来?

4

2 回答 2

4

如果您想阻止弹出窗口窃取鼠标事件,那么CSS您可以按照此处的建议设置与pointer-events: none;创建时给出的弹出窗口 id 相对应的 id。因此,在您的情况下,它将是:

#featurePopup{
    pointer-events: none;
}

当我想避免我显示的弹出窗口闪烁时,它对我来说就像一种魅力mouseover

于 2012-06-26T09:16:40.040 回答
3

我用另一种方式做到了。我让 OpenLayers 捕获事件,但在此之前我触发了另一个事件。

 $('a', current_popup.contentDiv).on('click', function(evt) {
      var jtarget = $(evt.target);
      hide_popup();  // hides OpenLayers popup
      $(document).trigger('edit_link_clicked', {
           feature: features[jtarget.parent().find('a').index(jtarget)],
           cluster: f,
           url: jtarget.attr('href')
      });
      return false;
 });
于 2012-06-27T04:48:46.777 回答