从托管 bean 调用 JavaScript 函数

IT技术 javascript jsf primefaces managed-bean
2021-01-20 20:18:53

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

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

6个回答

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 调用时才有效

全脸

使用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>
@Ced:是的(前提是标头仅在 ajax 响应中)。我只是没有看到这与当前问题有什么关系。对于未来的题外问题,请按 [Ask Question] 按钮。
2021-03-30 20:18:53
如果响应头具有无内联脚本的内容安全策略,omniface oncomplete 是否会工作?
2021-04-04 20:18:53

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

从 Primefaces 3.4 文档:

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

代码

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

Primefaces 中最接近的东西是;

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

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

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

你不能简单地。

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

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

嗨,我不明白条件调用是什么意思,即我如何调用 javascript 函数,我在带有 JAVASCRIPTCONTEXT 的 Richfaces 中发现了类似的功能......
2021-03-19 20:18:53
@Jigar Joshi 我是 JSF 甚至开发的新手,我想知道如何调用 js 方法,为此,primefaces 中有任何可用的标准方法。假设在 managedbean 中成功满足条件。
2021-04-03 20:18:53
在 js 函数中你可以拥有if("#{someManagedBean.someFlag}"=='true'){//take action }
2021-04-03 20:18:53
您可以根据 managedbean 中设置的值有条件地调用 JavaScript通过这个语句我的意思是,您可以检查托管 bean 的某些属性,然后决定是否调用 js
2021-04-06 20:18:53

通常,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

谢谢你,尼基尔。我已经用其他方式修复了它。但它真的很好的信息
2021-04-06 20:18:53