page - ¿Cómo invocar un bean gestionado JSF en un evento HTML DOM usando JavaScript nativo?
funcion onload javascript (1)
Necesito ejecutar un método de acción de beans gestionado JSF utilizando ajax durante el evento de load
HTML DOM, similar a jQuery''s $(document).ready(function() { $.ajax(...) })
. Solo puedo usar el JavaScript generado por JSF en este proyecto. ¿Hay alguna manera de hacerlo en JSF nativo? ¿Qué evento puedo usar o qué función JSF ajax puedo usar?
Estoy usando JSF 2.0, Facelets y PrimeFaces.
Varias maneras.
Use el truco de la "forma oculta" (en realidad, "piratear" le da a la fealdad una mejor redacción).
<h:form id="form" style="display:none;"> <h:commandButton id="button" action="#{bean.action}"> <f:ajax render=":results" /> </h:commandButton> </h:form> <h:panelGroup id="results"> ... </h:panelGroup>
Puede invocarlo en JS de la siguiente manera:
document.getElementById("form:button").onclick();
Tenga en cuenta la importancia de activar
onclick()
lugar declick()
en el caso de<h:commandButton>
. Elonclick()
invoca inmediatamente la funciónonclick
mientras que elclick()
solo activa el evento "clic" en el elemento, que no es compatible con IE. Si usaba un<h:commandLink>
, puede usarclick()
forma segura.Para invocarlo durante
load
evento deload
, considere ponerlo en<h:outputScript target="body">
. Eltarget="body"
coloca automáticamente el<script>
en el extremo de<body>
, por lo tanto, un contenedor$(document).ready()
es innecesario.<h:outputScript target="body"> document.getElementById("form:button").onclick(); </h:outputScript>
Como ya está utilizando PrimeFaces, simplemente use su
<p:remoteCommand>
.<h:form> <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" /> </h:form> <h:panelGroup id="results"> ... </h:panelGroup>
Puede invocarlo en JS de la siguiente manera:
commandName();
Sin embargo, esto no utiliza el JSF nativo
jsf.ajax.request()
, sino que utiliza PrimeFaces jQuery nativo (ya sabes, PrimeFaces es una biblioteca de componentes JSF sobre jQuery / UI).Para invocarlo durante
load
evento deload
, establezcaautoRun="true"
.<p:remoteCommand ... autoRun="true" />
Cree un
UIComponent
personalizado que amplíeUICommand
y genere la llamadajsf.ajax.request()
JSF nativajsf.ajax.request()
. En esencia, reinventa el<p:remoteCommand>
para utilizar JSF ajax nativo en lugar de jQuery. La biblioteca de utilidades JSF OmniFaces tiene un componente<o:commandScript>
que hace exactamente eso. Ver también el escaparate y el código fuente .<h:form> <o:commandScript name="commandName" action="#{bean.action}" render=":results" /> </h:form> <h:panelGroup id="results"> ... </h:panelGroup>
Puede invocarlo en JS de la siguiente manera:
commandName();
Para invocarlo durante
load
evento deload
, establezcaautorun="true"
.<o:commandScript ... autorun="true" />
Actualice a JSF 2.3 y use el componente nativo
<h:commandScript>
. Está disponible desde 2.3.0-m06 . La sintaxis es exactamente la misma que la anterior<o:commandScript>
. Simplemente reemplaceo:
porh: