Is there a way to call (execute) a JavaScript function from managed bean in JSF?
If that's relevant, I'm also using PrimeFaces.
Use PrimeFaces#executeScript()
:
public void submit() {
// ...
PrimeFaces.current().executeScript("alert('peek-a-boo');");
}
NOTE: works only when submit()
is invoked by Ajax.
Use RequestContext#execute()
:
public void submit() {
// ...
RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}
NOTE: works only when submit()
is invoked by Ajax.
Use PartialViewContext#getEvalScripts()
:
public void submit() {
// ...
FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}
NOTE: works only when submit()
is invoked by Ajax.
Use Ajax#oncomplete()
.
public void submit() {
// ...
Ajax.oncomplete("alert('peek-a-boo');");
}
NOTE: works only when submit()
is invoked by Ajax.
Best what you can do is to set the desired script as a bean property and conditionally render a <h:outputScript>
component when the bean property is not empty.
<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
// ...
script = "alert('peek-a-boo');";
}
In case you're submitting the form by Ajax, don't forget to wrap the <h:outputScript>
in another component and ajax-update it instead. See also Ajax update/render does not work on a component which has rendered attribute.
<h:commandButton ... action="#{bean.submit}">
<f:ajax execute="@form" render="script" />
</h:commandButton>
<h:panelGroup id="script">
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
</h:panelGroup>
Depending on which version of Primefaces you're on you can use RequestContext.execute("{js here}");
From the Primefaces 3.4 documentation:
RequestContext provides a way to execute javascript when the ajax request completes, this approach is easier compared to passing callback params and execute conditional javascript. Example below hides the dialog when ajax request completes;
Code
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With