2010-10-10 14 views
0

Utilisation de RichFaces 3.3.3, JSF 1.2 et Facelets. Pour des raisons de présentation, j'ai besoin d'envelopper le contenu de certaines divs avec d'autres divs pour pouvoir les styliser d'une certaine manière. J'utilise jQuery pour faire cela en tant que son nettoyeur lors de l'écriture HTML et il peut être contrôlé dans un endroit, sinon je dois coder en dur le divs supplémentaire chaque endroit où je veux les utiliser.Ok pour encapsuler les composants JSF générés html avec ses propres divs en utilisant jQuery après chargement de la page?

par ex. JSF généré HTML d'origine:

<div id="j_id4:main-container"> 
    <div id="j_id4:j_id5:nav">...</div> 
</div> 

après avoir utilisé JQuery HTML ressemble maintenant à ceci:

<div id="j_id4:main-container"> 

    <div class="top"><div></div></div> 

    <div class="middle"> 
      <div id="j_id4:j_id5:nav">...</div> 
    </div> 

    <div class="bottom"><div></div></div> 

</div> 

cela peut-il causer des problèmes? Je vais contre cette rule de la documentation jboss de richfaces qui dit:

Tout framework Ajax ne doit pas ajouter ou supprimer , mais seulement remplacer les éléments sur la page. Pour les mises à jour réussies, un élément ayant le même ID que dans la réponse doit exister sur la page. Si vous souhaitez ajouter un code à une page , placez-y un espace réservé (n'importe quel élément vide ). Pour la même raison, il est recommandé de placer les messages dans le composant "AjaxOutput" (comme aucun message est aussi un message).

Si je ne peux pas faire cela, quelle autre approche suggéreriez-vous?

MISE À JOUR 1:

J'ai essayé sur une page qui a une riche: TabPanel de contrôle mis en mode ajax, je l'ai fait la première (par défaut) l'un des contenus de tabulation soient les divs imbriqués sur dom prêt via jQuery. ça fonctionne bien la première fois, mais quand je clique sur les autres onglets et que je reviens au premier, les divs supplémentaires n'apparaissent pas. Je pense que c'est parce que le js est lancé une seule fois au dom ready et ensuite sur le ré-encodage richfaces du contrôle tabPanel il se répète comme s'il n'était pas conscient des divs supplémentaires. est-il un moyen d'éviter cela?

Répondre

1

Tant que vous ne dérangez pas les ID d'élément existants, je n'ai pas de problèmes techniques. La règle de RichFaces est probablement juste de se mettre en sécurité dans le cas où un utilisateur rencontre des problèmes avec cela, principalement lors de la suppression d'éléments ou de l'ajout d'éléments avec le même ID. Au moins, ils n'ont pas dit "ne peut pas", mais juste "ne devrait pas". En ce qui concerne le problème réel: JSF n'est bien sûr pas au courant des éléments HTML nouvellement ajoutés et ne les prend pas en compte lors du ré-rendu du HTML sur le côté client. Vous auriez besoin d'écrire une fonction de rappel qui "corrige" la structure DOM HTML après le rendu de JSF. Alternativement, si l'insertion de ces éléments déjà dans la vue (la page XHTML) n'est pas une option, vous pouvez envisager d'écrire un rendu personnalisé qui rend les éléments comme vous le souhaitez.

+0

Je voudrais simplement ajouter: en tant que composants JSF "met à jour" en les rendant complètement, il ne devrait pas importer ce qui est réellement dans le composant.En outre, je suppose que JSF reconnaît les composants simplement par leurs ID (car chaque instance de composant a un ID unique), donc les sélecteurs spéciaux qui dépendent de la structure DOM ne sont pas utilisés. –

+0

je l'ai essayé et éprouve un comportement non désiré. voir la mise à jour de la question –

+0

@BalusC: Est-ce un bon moyen? Écrire des rendus personnalisés? J'y ai pensé, pour écrire un a4j: customPanel ou quelque chose comme ça qui dessinerait ma structure div et je pourrais mettre mon contenu et d'autres contrôles dedans. Existe-t-il un moyen de faire prendre conscience au JSF du nouveau HTML? –