从托管bean调用JavaScript函数

时间:2011-04-15 09:49:01

标签: javascript jsf primefaces managed-bean

有没有办法从JSF中的托管bean调用(执行)JavaScript函数?

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

6 个答案:

答案 0 :(得分:43)

在PrimeFaces 6.2之前,您可以使用RequestContext#execute()

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

在PrimeFaces 6.2及以上版本中:

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

在标准JSF中,没有直接的公共API。最好的方法是将所需的脚本设置为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。另请参阅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>

至于“没有直接的公共API”声明,奇怪的是PartialResponseWriter类(负责编写JSF ajax响应)已经有JSF 2.0 startEval()endEval()方法这应该使您能够直接将回调脚本写入响应,但在即将到来的JSF 2.3中,PartialViewContext中出现了令人惊讶的没有公共方法将委托给这些方法。根据{{​​3}} PartialViewContext#getEvalScripts()最终添加到公共API。

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

对于较旧的JSF版本,只能通过创建自定义PartialViewContext实现来实现。 JSF实用程序库OmniFaces与issue 1412完全相同,可以通过OmniPartialViewContext使用。

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

另见:

答案 1 :(得分:34)

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

来自Primefaces 3.4文档:

  

RequestContext提供了一种在ajax时执行javascript的方法   请求完成后,与传递相比,这种方法更容易   回调参数并执行条件javascript。以下示例   当ajax请求完成时隐藏对话框;

代码

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

答案 2 :(得分:7)

答案 3 :(得分:4)

你不能简单。

Managed Bean适用于浏览器上的服务器和JavaScript。

您可以根据managedbean

中设置的值有条件地调用JavaScript

答案 4 :(得分: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

答案 5 :(得分:0)

我正在使用IceFaces,并使用org.icefaces.util.JavaScriptRunner解决了

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