45

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

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

4

6 回答 6

63

PrimeFaces 6.2+

使用PrimeFaces#executeScript()

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

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

PrimeFaces 6.2-

使用RequestContext#execute()

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

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

JSF 2.3+

使用PartialViewContext#getEvalScripts()

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

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

OmniFaces

使用Ajax#oncomplete().

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

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

JSF 2.2-

您可以做的最好的事情是将所需的脚本设置为 bean 属性,并<h:outputScript>在 bean 属性不为空时有条件地呈现组件。

<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 更新/渲染不适用于已渲染属性的组件

<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>
于 2015-07-01T06:31:52.610 回答
38

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

从 Primefaces 3.4 文档:

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

代码

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}
于 2012-11-20T13:23:19.893 回答
8

Primefaces 中最接近的东西是;

http://www.primefaces.org/showcase/ui/callbackParams.jsf

话虽如此,3.0 中也有增强;

http://code.google.com/p/primefaces/issues/detail?id=1342

于 2011-04-15T22:21:26.843 回答
4

你不能简单地。

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

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

于 2011-04-15T09:52:52.400 回答
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

于 2012-03-16T23:52:31.627 回答
0

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

JavaScriptRunner.runScript(FacesContext.getCurrentInstance(), "<your_script>;");
于 2020-10-01T08:56:05.013 回答