Primefaces, JavaScript et JSF ne fonctionne pas bien ensemble ou que je fais quelque chose de mal

StackOverflow https://stackoverflow.com/questions/4038456

Question

Voici quelque chose si simple

<p:commandLink value="Tom" onclick="document.getElementById('tom').focus()"/><br/>
<input id="tom"/>

Lorsque u cliquez sur Tom, la mise au point get textbox. Grand, maintenant essayer cette

<p:commandLink value="Tom" onclick="document.getElementById('tom').focus()"/><br/>
<h:inputText id="tom"/> <br/>

quand je clique sur rien ne se passe, je vérifie Firebug, je vois

document.getElementById("tom") is null

Lorsque je tente d'utiliser jQuery $('#tom').focus(), rien ne se passe, pas d'erreur, mais n'a pas obtenu soit mise au point. Ceci est le response (pas sûr si cela est la réponse du serveur) quand je vois de Firebug

<?xml version="1.0" encoding="utf-8"?>
<partial-response>
    <changes>
       <update id="javax.faces.ViewState"><![CDATA[455334589763307998:-2971181471269134244]]></update>
    </changes>
    <extension primefacesCallbackParam="validationFailed">{"validationFailed":false}</extension>
</partial-response>

Était-ce utile?

La solution

Dans JSF, l'ID d'éléments sont préfixés par l'ID de la forme qui les contient (plus généralement, leur carte d'identité sont préfixés par l'ID de tous les composants parent qui implémente le NamingContainer interface). Par exemple:

<h:form id="myForm">
    <h:inputText id="tom" .../>

va générer le code HTML suivant:

<input id="myForm:tom" ...>

Pour accéder au <input> vous devez utiliser l'ID myForm:tom et non l'ID tom lui-même.

Avec jQuery, vous devrez utiliser $("myForm\:tom").focus();

Autres conseils

JSF préfixer ID de des enfants UINamingContainer (h:form, h:dataTable , etc.) avec l'identifiant du composant UINamingContainer lui-même. Vous pouvez désactiver cette fonctionnalité en définissant l'attribut prependId à false.

<h:form prependId="false">

Vous ne sera pas en mesure d'inclure plus dynamiquement le même morceau de code quelque part ailleurs dans le même point de vue. Gardez cela à l'esprit lors de la désactivation de cette.

et Primefaces2, u devrait utiliser au lieu de jQuery $, comme ceci:

 <h:commandButton id="dome" value="提交" action="#{uInfo.doMe}">
  <f:ajax execute="@form" render="@form"/>
 </h:commandButton>
 ...
 <script type="text/javascript">
 function refresh() {
  jQuery("input#dome").click();
 }
 var t=setInterval('refresh()', 5000);
 </script>

Vous devez donner cette balise JSF un attribut id, comme ceci:

<h:inputText id="tom" />

Dans le cas contraire, il ne sera pas rendu avec un id, et donc il n'y aura pas d'élément id="tom" à trouver.

Ne pas oublier que primefaces laisser aussi de vous utilisez le widgetvar d'attribut pour attacher votre composant à un objet javascript.

par exemple:

<p:inputText widgetvar="tom" id="tom" />

puis dans votre code javascript ou un rappel javascript vous pouvez faire:

tom.disable()

etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top