2010-10-27 15 views
1

Je travaille sur un projet qui intègre OpenLayers et Qooxdoo ... jusqu'à présent j'ai beaucoup de succès. Mais maintenant je veux pouvoir placer des widgets qooxdoo dans une popup OpenLayers (FramedCloud dans ce cas) et quelque chose de bizarre se passe - le bouton ne cliquera pas! Les événements hover semblent fonctionner, et j'ai déterminé que qx.event.handler.Focus .__ onNativeMouseDown est en cours d'exécution, donc l'événement click semble atteindre le système d'événements qooxdoo (?), Mais qx .event.handler.Mouse._onButtonEvent n'est jamais appelé!qx.ui.root.Inline dans un popup OpenLayers contentDiv => ne clique pas!

Soit quelque chose dans l'OL est gênant, soit je fais quelque chose de mal. Voir un ou les deux de ces liens pour un test:

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

(noter que le lien "source" charge les versions non compressées/debug des à la fois qooxdoo et OpenLayers, donc il faut un certain temps à charger)

les liens ci-dessus build sur le squelette qx app Inline, voici la partie principale personnalisée du code:

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

Quelqu'un peut-il m'aider à comprendre ce qu'il se passe avec l'événement click?


== == EDIT

Merci Alex, je l'ai fait un peu plus à brancher pour essayer de comprendre.

J'ai essayé un test essentiellement du même code en dehors de la carte OL et cela fonctionne, donc c'est éliminé.

Je l'ai fait en plus à l'objet contextuel OL:

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

Ce que je pense désactive tout la gestion des événements dans la fenêtre contextuelle lui-même (avis, par exemple, vous pouvez maintenant déplacer la carte en faisant glisser dans le Sans PopUp -qui est sous-optimal, mais prouve le point). Et, cela n'a pas aidé ... ce qui semble suggérer que peut-être la manipulation de l'événement sur la carte elle-même bloque les événements. Je ne peux pas désactiver les événements de la souris sur la carte, pour des raisons évidentes.

Je vais transmettre cela à la liste de diffusion OpenLayers dans l'espoir de plus d'aide ... mais en attendant, quelqu'un a des idées pour une solution de contournement? Si étrange que certains événements (mouseover) fonctionnent bien, mais pas le clic. Je suis ouvert même aux hacks à ce stade.

De plus, j'ai vraiment du mal à déboguer ceci ... J'ai essayé d'utiliser la fonctionnalité "Break on Next" dans Firebug (et le débogueur Safari), mais comme qooxdoo exécute plusieurs temporisateurs internes, je ne peux pas attrape le clic à cause du bruit (le code d'intervalle arrive toujours avant que je puisse cliquer). Tous les conseils sur la façon d'attraper l'événement de clic dans le débogueur seraient appréciés!

Répondre

0

Je viens de tester votre exemple et je pense que l'implémentation de la couche bloque l'événement click. Donc, l'événement click est d'abord traité par OpenLayers et qooxdoo ne l'obtient pas.

Assurez-vous que rien ne va pas avec l'implémentation en ligne de qooxdoo. Avez-vous déjà testé votre bouton en ligne sans inclure les éléments OpenLayers? Si tout fonctionne correctement sans l'implémentation d'OpenLayers, vous savez au moins qu'OpenLayers bloque les événements.

Ce serait ma première étape dans le débogage. J'espère que ça aidera un peu.

Cordialement, Alex

1

J'ai eu le même problème. Cliquer sur le Qooxdoo ne fonctionne pas. J'utilise Qooxdoo v1.6 et OpenLayers v2.12. Le problème était l'événement mousedown sur le popup et le Map-Navigator. Dans mon cas, ce qui suit fonctionne correctement:

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

J'espère que cela sera utile à tous.