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 回答