从托管 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 属性不为空时有条件地呈现 <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>
【讨论】:
如果响应头的内容安全策略为无内联脚本,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 函数?