从托管 bean 调用 JavaScript 函数

发布于 2024-11-01 17:21:15 字数 81 浏览 1 评论 0原文

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

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

Is there a way to call (execute) a JavaScript function from managed bean in JSF?

If that's relevant, I'm also using PrimeFaces.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

胡大本事 2024-11-08 17:21:15

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:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
    // ...
    script = "alert('peek-a-boo');";
}

如果您通过 Ajax 提交表单,请不要忘记将 包装在另一个组件中,然后使用 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>

PrimeFaces 6.2+

Use PrimeFaces#executeScript():

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

NOTE: works only when submit() is invoked by Ajax.

PrimeFaces 6.2-

Use RequestContext#execute():

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

NOTE: works only when submit() is invoked by Ajax.

JSF 2.3+

Use PartialViewContext#getEvalScripts():

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

NOTE: works only when submit() is invoked by Ajax.

OmniFaces

Use Ajax#oncomplete().

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

NOTE: works only when submit() is invoked by Ajax.

JSF 2.2-

Best what you can do is to set the desired script as a bean property and conditionally render a <h:outputScript> component when the bean property is not empty.

<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
    // ...
    script = "alert('peek-a-boo');";
}

In case you're submitting the form by Ajax, don't forget to wrap the <h:outputScript> in another component and ajax-update it instead. See also 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>
一向肩并 2024-11-08 17:21:15

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

来自 Primefaces 3.4 文档:

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

代码

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

Depending on which version of Primefaces you're on you can use RequestContext.execute("{js here}");

From the Primefaces 3.4 documentation:

RequestContext provides a way to execute javascript when the ajax
request completes, this approach is easier compared to passing
callback params and execute conditional javascript. Example below
hides the dialog when ajax request completes;

Code

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}
纵情客 2024-11-08 17:21:15

你不能简单地。

托管 Bean 在服务器上运行,而 JavaScript 在浏览器上运行。

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

You can't simply.

Managed Bean works on server and JavaScript on browser.

You can make conditionally invoke JavaScript depending on the value set in managedbean

℉絮湮 2024-11-08 17:21:15

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

In general, Java provides an API to evaluate a string using a scripting engine. This can be accomplished by javax.script.ScriptEngine and javax.script.ScriptEngineManager classes.

I am not entirely sure what your situation is, but if you can pass the javascript as a string to the managed bean, you could probably use Java scripting API to run the javascript on the server side.

For more information, check out this link:
http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

尹雨沫 2024-11-08 17:21:15

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

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

I'm using IceFaces and I solved with org.icefaces.util.JavaScriptRunner:

JavaScriptRunner.runScript(FacesContext.getCurrentInstance(), "<your_script>;");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文