从托管 bean 调用 JavaScript 函数

Posted

技术标签:

【中文标题】从托管 bean 调用 JavaScript 函数【英文标题】:Calling a JavaScript function from managed bean 【发布时间】:2011-08-06 05:03:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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 属性不为空时有条件地呈现 &lt;h:outputScript&gt; 组件。

<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 提交表单,请不要忘记将 &lt;h:outputScript&gt; 包装在另一个组件中并进行 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>

【讨论】:

如果响应头的内容安全策略为无内联脚本,omniface oncomplete 会起作用吗? @Ced:是的(前提是标头仅在 ajax 响应中)。我只是没有看到这与当前问题有什么关系。对于未来的离题问题,请按 [] 按钮。【参考方案3】:

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

来自 Primefaces 3.4 文档:

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

代码

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

【讨论】:

【参考方案4】:

一般来说,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】:

Primefaces 中最接近的东西是;

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

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

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

【讨论】:

【参考方案6】:

你不能简单。

Managed Bean 在服务器上运行,在浏览器上运行 JavaScript。

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

【讨论】:

嗨,我不明白条件调用是什么意思,即我如何调用 javascript 函数,我在 JAVASCRIPTCONTEXT 的 Richfaces 中发现了类似的功能......。 您可以根据 managedbean 中设置的值有条件地调用 JavaScript 我的意思是,您可以检查托管 bean 的某些属性,然后决定调用js 与否 @Jigar Joshi 我是 JSF 甚至是开发的新手,我想知道如何调用 js 方法,要做到这一点,primefaces 中有任何可用的标准方法。假设在 managedbean 中成功满足条件。 在js函数中你可以有if("#someManagedBean.someFlag"=='true')//take action

以上是关于从托管 bean 调用 JavaScript 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSF 托管 bean 属性传递给 JavaScript 函数?

如何从托管 WebBrowser 控件的应用程序调用 WebBrowser 控件查看的页面中的 JavaScript 函数?

使用 URL 参数的 JSF 托管 Bean 方法调用

如何从托管 bean 中获取消息包字符串?

从 MainPage 在托管页面上调用 javascript

通过JSF中的JavaScript从bean获取更新值