qx.ui.root.Inline во всплывающем окне OpenLayers, кнопка contentDiv =› не нажимается!

Я работаю над проектом, который интегрирует 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);

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


== РЕДАКТИРОВАТЬ ==

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

Я попробовал протестировать практически тот же код за пределами карты 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), но, поскольку qooxdoo запускает несколько внутренних таймеров, я не могу поймать щелчок, потому что шума (код интервала всегда появляется до того, как я могу щелкнуть). Любые советы о том, как поймать событие щелчка в отладчике, будут оценены!


person S'pht'Kr    schedule 27.10.2010    source источник


Ответы (2)


У меня такая же проблема. Нажатие на 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

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

person bassi    schedule 13.07.2012

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

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

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

С уважением, Алекс

person Alexander Steitz    schedule 28.10.2010