从托管bean调用JavaScript函数

50

有没有一种方法可以在JSF中从托管的Bean中调用(执行)JavaScript函数?

如果相关的话,我也在使用PrimeFaces。

6个回答

70

PrimeFaces 6.2+

使用PrimeFaces#executeScript()方法:

public void submit() {
    // ...
    PrimeFaces.current().executeScript("alert('peek-a-boo');");
}

注意:仅当通过Ajax调用submit()时才有效。

PrimeFaces 6.2-

请使用RequestContext#execute()

public void submit() {
    // ...
    RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}

注意:仅当Ajax调用submit()时才有效。

JSF 2.3+

使用PartialViewContext#getEvalScripts()

public void submit() {
    // ...
    FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}

注意:仅在通过Ajax调用submit()时起作用。

OmniFaces

使用Ajax#oncomplete()

public void submit() {
    // ...
    Ajax.oncomplete("alert('peek-a-boo');");
}

注意:仅在Ajax调用submit()时起作用。

JSF 2.2-

最好的方法是将所需的脚本设置为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>

如果响应头中有一个内容安全策略为“no inline script”,那么 omniface oncomplete 会起作用吗? - Ced
1
@Ced:是的(前提是标题只在ajax响应中)。我只是不明白这与当前问题有什么关系。对于将来的离题问题,请按[提问]按钮。 - BalusC

38

根据您使用的Primefaces版本,您可以使用RequestContext.execute("{js here}");

来自Primefaces 3.4文档:

  

当ajax请求完成时,RequestContext提供了执行javascript的方式,这种方法比传递回调参数和执行条件性javascript更容易。下面是一个示例,隐藏对话框当ajax请求完成时;

代码

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}

8

4

您不能简单地这样做。

Managed Bean 在服务器上工作,而 JavaScript 在浏览器上。

您可以根据在 managedbean 中设置的值有条件地调用 JavaScript。


嗨,我不理解什么是条件调用,即如何调用JavaScript函数,并且我在Richfaces中发现了类似的功能,使用JAVASCRIPTCONTEXT...... - Maddy
您可以根据托管bean中设置的值有条件地调用JavaScript。我的意思是,您可以检查托管bean的某些属性,然后决定是否调用js。 - jmj
@Jigar Joshi 我是JSF和开发新手,想知道如何调用js方法,是否在primefaces中有任何标准方法可用。假设在managedbean中成功满足条件。 - Maddy
在 JavaScript 函数中,你可以这样写:if("#{someManagedBean.someFlag}"=='true'){//take action } - jmj

1
通常情况下,Java提供了一个API来使用脚本引擎评估字符串。这可以通过javax.script.ScriptEngine和javax.script.ScriptEngineManager类来实现。
我不完全确定您的情况是什么,但如果您可以将javascript作为字符串传递给托管bean,则可能可以使用Java脚本API在服务器端运行javascript。
有关更多信息,请查看此链接: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

谢谢,Nikhil。我已经用其他方法解决了它。但这是非常有用的信息。 - Maddy

0

我正在使用IceFaces,并且我通过org.icefaces.util.JavaScriptRunner解决了这个问题:

JavaScriptRunner.runScript(FacesContext.getCurrentInstance(), "<your_script>;");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接