1

OpenLayers と Qooxdoo を統合するプロジェクトに取り組んでいます...これまでのところ、多くの成功を収めています。しかし、qooxdoo ウィジェットを OpenLayers ポップアップ (この場合は FramedCloud) に配置できるようにしたいのですが、奇妙なことが起こっています。ボタンをクリックしません!

ホバーイベントは動いているようで、qx.event.handler.Focus.__onNativeMouseDownが実行されていると判断したので、クリックイベントはqooxdooイベントシステムに届いているようですが(?)、qx.event.handler .Mouse._onButtonEvent が呼び出されることはありません。

OLの何かが邪魔をしているのか、私が何か間違っているのか。テスト ケースについては、次のリンクのいずれかまたは両方を参照してください。

http://s89238293.onlinehome.us/olisletest/build/index.html http://s89238293.onlinehome.us/olisletest/source/index.html

(「ソース」リンクは、qooxdooとOpenLayers の両方の非圧縮/デバッグ バージョンをロードするため、ロードに時間がかかることに注意してください!)

上記のリンクはスケルトン qx Inline アプリに基づいて構築されています。コードの主要なカスタム部分は次のとおりです。

  var map = new OpenLayers.Map("map_canvas", {
      projection: new OpenLayers.Projection("EPSG:900913"),
      displayProjection: new OpenLayers.Projection("EPSG:4326"),
      units: "m",
      numZoomLevels: 18,
      maxResolution: 156543.0339,
      maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
                                       20037508, 20037508.34)
  });

  map.addLayer(new OpenLayers.Layer.OSM());

  map.setCenter(new OpenLayers.LonLat(-97.0, 38.0).transform(map.displayProjection, map.projection), 3);

  var popup = new OpenLayers.Popup.FramedCloud(
          "searchSelection",
          new OpenLayers.LonLat(-97.0, 38.0).transform(map.displayProjection, map.projection),
          new OpenLayers.Size(200, 200),
          null,
          null,
          true,
          null
  );
  popup.autoSize = false;
  map.addPopup(popup);

  var button2 = new qx.ui.form.Button("A Button");
  button2.addListener("execute", function(){alert("Hello???");}, this);

  var isle = document.createElement("DIV");
  popup.contentDiv.appendChild(isle);
  var popupIsle = new qx.ui.root.Inline(isle, false, false);
  popupIsle.setLayout(new qx.ui.layout.VBox);
  popupIsle.setBackgroundColor("#fff");
  popupIsle.add(button2);

クリックイベントに何が起こっているのかを理解するのを手伝ってくれる人はいますか?


==編集==

アレックスに感謝します。

OL マップの外側で本質的に同じコードのテストを試みたところ、動作するので、それは解消されました。

OLポップアップオブジェクトに追加でこれを行いました:

popup.events.un({
  "mousedown": popup.onmousedown,
  "mousemove": popup.onmousemove,
  "mouseup": popup.onmouseup,
  "click": popup.onclick,
  "mouseout": popup.onmouseout,
  "dblclick": popup.ondblclick,
  scope: popup
});

これにより、ポップアップ自体ですべてのイベント処理が無効になると思います(たとえば、ポップアップ内でドラッグしてマップをパンできるようになりました。これは最適ではありませんが、要点を証明しています)。そして、それは役に立ちませんでした...おそらく、マップ自体でのイベント処理がイベントをブロックしていることを示唆しているようです. 明らかな理由で、マップ上のマウス イベントを無効にすることはできません。

私はこれを OpenLayers メーリング リストに送信して、さらに助けが得られることを期待しています...しかし、それまでの間、誰か回避策のアイデアをお持ちですか? いくつかのイベント (マウスオーバー) は正常に機能するのに、クリックが機能しないのは私には奇妙です。現時点では、ハッキングに対してもオープンです。

また、これをデバッグするのに本当に苦労しています... Firebug(およびSafariデバッガー)の「Break on Next」機能を使用してみましたが、qooxdooは内部でいくつかのインターバルタイマーを実行しているため、クリックをキャッチできませんノイズ(クリックする前にインターバルコードが常に表示されます)。デバッガーでクリックイベントをキャッチする方法についてのヒントをいただければ幸いです!!

4

2 に答える 2

1

私も同じ問題を抱えていました。Qooxdoo をクリックしても機能しません。Qooxdoo v1.6 と OpenLayers v2.12 を使用しています。問題は、ポップアップとマップナビゲーターのマウスダウンイベントでした。私の場合、以下は正常に機能しています:

// looking for the navigation control of the map
var controls = map.controls;
var navigator;
for(var i = 0; i < controls.length; i++) {
    if(controls[i].CLASS_NAME == "OpenLayers.Control.Navigation")
        navigator = controls[i];
}

popup.events.unregister("mousedown", popup, popup.onmousedown); // disable the mousedown-event
popup.events.register("mouseover", navigator, navigator.deactivate()); // on mouseover: deactivate the navigation-control of the map
popup.events.register("mouseout", navigator, navigator.activate()); // on mouseout: activate the navigation-control of the map

これが誰にとっても役立つことを願っています。

于 2012-07-13T14:57:15.010 に答える
0

私はあなたの例をテストしたところですが、レイヤーの実装がクリックイベントをブロックしていると思います。したがって、クリックイベントは最初にOpenLayersによって処理され、qooxdooはそれを取得しません。

qooxdooのインライン実装に問題がないことを確認してください。OpenLayersのものを含めずにインラインボタンをすでにテストしましたか?OpenLayersを実装しなくてもすべてが正常に機能している場合は、少なくともOpenLayersが何らかの形でイベントをブロックしていることがわかります。

これがデバッグの最初のステップになります。それが少し役立つことを願っています。

よろしく、アレックス

于 2010-10-28T08:28:44.613 に答える