2010-10-27 132 views
1

我正在开发一个集成了OpenLayers和Qooxdoo的项目......到目前为止我已经取得了很多成功。但是现在我希望能够将qooxdoo小部件放置在OpenLayers弹出窗口中(在这种情况下是FramedCloud),并且发生了一些奇怪的事情 - 按钮不会点击!qx.ui.root.Inline在OpenLayers弹出的contentDiv =>按钮不会点击!

悬停事件似乎正在工作,并且我确定qx.event.handler.Focus .__ onNativeMouseDown正在执行,所以click事件似乎正在进入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嵌入式应用上面建立的联系,这里的代码的主要习俗部分:

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

我想这将禁用所有的事件处理上弹出本身(注意,例如,您现在可以通过popup-内拖动平移地图 - 这是不理想的,但证明了这一点)。而且,这并没有帮助......这似乎表明,地图上的事件处理本身可能会阻止事件发生。我无法禁用地图上的鼠标事件,原因很明显。

我打算将这个信息传递给OpenLayers邮件列表,希望得到更多的帮助......但同时,任何人都有任何解决方法的想法?对我来说很奇怪的是,一些事件(鼠标悬停)工作正常,但点击没有。在这一点上,我甚至会打开黑客。我试着在Firebug(和Safari调试器)中使用“Break on Next”功能,但由于qooxdoo在内部运行多个间隔定时器,所以我不能赶上点击,因为噪音(间隔代码总是出现之前,我可以点击)。任何提示如何捕捉调试器中的点击事件将不胜感激!

回答

0

我刚刚测试了您的示例,我认为该图层实现阻止了单击事件。所以点击事件首先由OpenLayers处理,而qooxdoo并没有得到它。

确保qooxdoo的内联实现没有任何问题。你是否已经测试了你的内联按钮,而不包括OpenLayers的东西?如果没有OpenLayers实现的情况下一切正常,你至少知道OpenLayers会以某种方式阻止事件。

这将是我调试的第一步。希望有点帮助。

问候, 亚历

1

我有同样的问题。点击Qooxdoo不起作用。我使用Qooxdoo v1.6和OpenLayers v2.12。问题是弹出窗口和Map-Navigator上的mousedown事件。在我的情况下,以下工作正常:

// 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 

我希望,这将有助于任何人。