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);
}

thisOpenLayers.Eventクラスのインスタンスでevt.targetあり、それでもそのアンカーであり、listeners1つのリスナーが含まれています。

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

これが理由ですか?どうやって取り出すの?

4

2 に答える 2

4

ポップアップがマウスイベントを盗むのを止めたい場合は、ここで提案されているように、作成時に指定されたポップアップ ID に対応する ID を設定CSSできます。したがって、あなたの場合は次のようになります。pointer-events: none;

#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 に答える