2011-02-24 3 views
0

J'ai une page avec un tas d'éléments dessus. Chaque élément a un widget qui, lorsqu'il est cliqué, fait apparaître un menu d'options de style contextuel YUI. Jusqu'à présent, cela fonctionne bien. J'utilise les appels jQuery/ajax pour insérer de nouveaux éléments dans la page, en poussant les éléments existants vers le bas. Les éléments sont insérés correctement, mais je dois maintenant mettre à jour, en quelque sorte, les positions des menus contextuels des éléments pour les faire correspondre aux nouvelles positions des widgets qui les invoquent. Pour autant que je sache, ils sont calculés en tant que coordonnées de page et stockés avec les objets de menu lorsque la page est rendue, et ne sont pas mis à jour automatiquement par les insertions ajax.Comment mettre à jour les positions du menu yui après une insertion de page ajax?

Voici où mon problème est: J'ai essayé certains jQuery qui, pour chaque menu, recompute l'élément de menu, fait un removeListener() pour tuer l'ancien menu, et fait un addListener() pour insérer ce qui devrait être le nouveau. Cela met correctement à jour les positions des menus quand ils sont invoqués, mais brise autre chose: Si je clique sur un widget et affiche un menu, puis clique ailleurs sur la page, le menu reste à l'écran au lieu de disparaître. Je peux cliquer sur d'autres widgets et ils apparaîtront aussi. Notes: aucune erreur n'apparaît dans la console; appuyer sur la touche ESCAPE pendant la présentation du menu cache correctement le menu.

Il doit y avoir un moyen de le faire, mais je suis perdu. Des indices? Peut-être que tout ce que j'ai vraiment besoin de faire est de mettre à jour les informations contextuelles du menu; Y a-t-il un moyen de le faire sans la séquence d'écouteurs delete-and-add qui semble me bousiller? Merci!

+0

Mise à jour: Il semble que l'astuce consiste à ignorer la recréation du menu et, à la place, de configurer un déclencheur de contexte YUI pour les superpositions de menu, ce qui entraînera le recalcul des contextes de menu. J'ai ajouté ceci - YAHOO.widget.Overlay.prototype.CONTEXT_TRIGGERS = YAHOO.widget.Overlay.prototype.CONTEXT_TRIGGERS.concat (["windowScroll"]); - à la page, et, si je fais défiler la fenêtre après avoir fait une insertion, tout est correct. Donc maintenant j'ai besoin d'un événement qui se déclenchera après une superposition, je suppose, déplacé, ou quelque chose de comparable. J'ai essayé "moveEvent", mais pas de chance. Cela aide-t-il quelqu'un? –

+0

Mise à jour # 2: l'ajout de "beforeShow" à la liste des triggers contextuels semble fonctionner. Toujours à l'affût, mais ... –

+0

Plus de documentation de mes essais: Pour en savoir plus, ajoutez le tableau de ces événements - ["beforeShow", "windowScroll"] - dans la création du menu (nouveau YAHOO .widget.Menu ...) n'a pas fonctionné. –

Répondre

0

Tout continue de bien se passer comme indiqué dans les mises à jour; Je déclare que cela doit être répondu.

Questions connexes