有没有一种方法可以在JSF中从托管的Bean中调用(执行)JavaScript函数?
如果相关的话,我也在使用PrimeFaces。
有没有一种方法可以在JSF中从托管的Bean中调用(执行)JavaScript函数?
如果相关的话,我也在使用PrimeFaces。
使用PrimeFaces#executeScript()
方法:
public void submit() {
// ...
PrimeFaces.current().executeScript("alert('peek-a-boo');");
}
注意:仅当通过Ajax调用submit()
时才有效。
public void submit() {
// ...
RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}
注意:仅当Ajax调用submit()
时才有效。
使用PartialViewContext#getEvalScripts()
:
public void submit() {
// ...
FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}
注意:仅在通过Ajax调用submit()
时起作用。
public void submit() {
// ...
Ajax.oncomplete("alert('peek-a-boo');");
}
注意:仅在Ajax调用submit()
时起作用。
最好的方法是将所需的脚本设置为bean属性,并在bean属性不为空时有条件地呈现<h:outputScript>
组件。
<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
// ...
script = "alert('peek-a-boo');";
}
如果您通过Ajax提交表单,请不要忘记将<h:outputScript>
标签包装在另一个组件中并替换ajax-update。参见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>
根据您使用的Primefaces版本,您可以使用RequestContext.execute("{js here}");
来自Primefaces 3.4文档:
当ajax请求完成时,RequestContext提供了执行javascript的方式,这种方法比传递回调参数和执行条件性javascript更容易。下面是一个示例,隐藏对话框当ajax请求完成时;
代码
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
您不能简单地这样做。
Managed Bean
在服务器上工作,而 JavaScript 在浏览器上。
您可以根据在 managedbean 中设置的值有条件地调用 JavaScript。
if("#{someManagedBean.someFlag}"=='true'){//take action }
。 - jmj我正在使用IceFaces,并且我通过org.icefaces.util.JavaScriptRunner解决了这个问题:
JavaScriptRunner.runScript(FacesContext.getCurrentInstance(), "<your_script>;");