Primefaces, JavaScript, e JSF non funziona bene insieme o sto facendo qualcosa di sbagliato
-
27-09-2019 - |
Domanda
Qui è una cosa così semplice
<p:commandLink value="Tom" onclick="document.getElementById('tom').focus()"/><br/>
<input id="tom"/>
Quando u clic sul Tom, l'attenzione testo get. Grande, ora provate questo
<p:commandLink value="Tom" onclick="document.getElementById('tom').focus()"/><br/>
<h:inputText id="tom"/> <br/>
quando clicco accadere nulla, verifico Firebug, vedo
document.getElementById("tom") is null
Quando provo ad utilizzare jQuery $('#tom').focus()
, niente accade, nessun errore, ma non ha ottenuto attenzione sia. Questo è il response
(non so se questa è la risposta data dal server) quando vedo da 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>
Soluzione
Nel JSF, l'ID di elementi hanno come prefisso l'ID della forma che li contiene (più in generale, il loro ID come prefisso l'ID di tutti i componenti genitore che implementa il NamingContainer
interfaccia). Ad esempio:
<h:form id="myForm">
<h:inputText id="tom" .../>
genererà il seguente codice HTML:
<input id="myForm:tom" ...>
: Per accedere al <input>
è necessario utilizzare l'ID myForm:tom
e non l'ID tom
stesso.
Con jQuery, si dovrà utilizzare $("myForm\:tom").focus();
Altri suggerimenti
JSF sarà anteporre ID dispone di UINamingContainer
bambini (h:form
, h:dataTable
, ecc) con l'ID del componente UINamingContainer
stesso. È possibile disattivare questa impostando l'attributo prependId
a false
.
<h:form prependId="false">
Hai solo non sarà più in grado di comprendere in modo dinamico lo stesso pezzo di codice da qualche altra parte nella stessa vista. Tenetelo a mente quando disabilitare questa.
e con Primefaces2, u dovrebbe utilizzare jQuery invece di $, in questo modo:
<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>
È necessario dare quel tag JSF un attributo id
, in questo modo:
<h:inputText id="tom" />
In caso contrario non sarà rendering con un id
, e quindi non ci sarà alcun elemento id="tom"
da trovare.
Non dimenticate che primefaces permetterà anche di utilizzare il widgetvar attributo per legare il componente a un oggetto JavaScript.
Così, per esempio:
<p:inputText widgetvar="tom" id="tom" />
poi nel codice javascript o di un javascript richiamata si potrebbe fare:
tom.disable()
ecc.