2010-10-27 2 views
1

Я работаю над проектом, который объединяет OpenLayers и Qooxdoo ... пока у меня много успеха. Но теперь я хочу иметь возможность размещать виджеты qooxdoo в всплывающем окне OpenLayers (FramedCloud в этом случае), и что-то странное происходит - кнопка не будет щелкать!qx.ui.root.Inline в OpenLayers popup 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, поэтому требуется некоторое время, чтобы загрузить)

ссылки выше сборок на скелете ого Встраиваемого приложения, вот основная пользовательская часть коды:

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

Может ли кто-нибудь помочь мне выяснить, что происходит с событием click?


== EDIT ==

Спасибо Алекс, я сделал еще немного затыкать на него, чтобы попытаться выяснить.

Я попробовал проверку по существу того же кода вне 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 в надежде на помощь ... но в то же время у кого-нибудь есть идеи для обходного пути? Настолько странно, что некоторые события (mouseover) работают нормально, но щелчок не делает. Я открыт даже для взлома в этот момент.

Кроме того, у меня очень тяжелая отладка этого ... Я попытался использовать функцию «Break on Next» в Firebug (и отладчике Safari), но поскольку qooxdoo запускает несколько интервальных таймеров внутри, я не могу поймать щелчок из-за шума (код интервала всегда появляется, прежде чем я могу щелкнуть). Любые советы о том, как поймать событие click в отладчике, будут оценены!

ответ

0

Я только что проверил ваш пример, и я думаю, что реализация уровня блокирует событие click. Таким образом, событие click сначала обрабатывается OpenLayers, а qooxdoo не получает его.

Уверены, что ничего не случилось с встроенной реализацией qooxdoo. Вы уже протестировали свою встроенную кнопку без включения материала OpenLayers? Если все работает нормально без реализации OpenLayers, вы знаете, по крайней мере, что OpenLayers каким-то образом блокирует события.

Это был бы мой первый шаг в отладке. Надеюсь, что это поможет.

С уважением, Alex

1

У меня была такая же проблема. Нажатие на Qooxdoo не работает. Я использую Qooxdoo v1.6 и OpenLayers v2.12. Проблема заключалась в событии mousedown на всплывающем окне и Map-Navigator. В моем случае следующее работает нормально:

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

Надеюсь, это было бы полезно для всех.

Смежные вопросы