如何使用本地JavaScript在HTML DOM事件上调用JSF托pipebean?

我需要在HTML DOM load事件中使用ajax执行一个JSF托pipebean操作方法,类似于jQuery的$(document).ready(function() { $.ajax(...) }) 。 我只能在这个项目中使用由JSF生成的JavaScript。 有没有办法在本地JSF中做到这一点? 我可以使用哪个事件或者哪个JSF ajax函数可以使用?

我正在使用JSF 2.0,Facelets和PrimeFaces。

几种方法。

  1. 使用“隐藏forms”的伎俩(实际上,“黑客”是丑陋的措辞)。

     <h:form id="form" style="display:none;"> <h:commandButton id="button" action="#{bean.action}"> <f:ajax render=":results" /> </h:commandButton> </h:form> <h:panelGroup id="results"> ... </h:panelGroup> 

    你可以在JS中调用它,如下所示:

     document.getElementById("form:button").onclick(); 

    注意在<h:commandButton>情况下触发onclick()而不是click()的重要性。 onclick()立即调用onclick函数,而click()只触发元素上的“click”事件,这在IE中不受支持。 如果您使用的是<h:commandLink> ,则可以安全地使用click()

    要在load事件中调用它,可以考虑把它放在<h:outputScript target="body">target="body"自动将<script>放在<body>末尾,因此不需要$(document).ready()包装器。

     <h:outputScript target="body"> document.getElementById("form:button").onclick(); </h:outputScript> 

  2. 正如你已经使用PrimeFaces,只需使用它的<p:remoteCommand>

     <h:form> <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" /> </h:form> <h:panelGroup id="results"> ... </h:panelGroup> 

    你可以在JS中调用它,如下所示:

     commandName(); 

    然而,这不使用JSF原生jsf.ajax.request() ,而是使用PrimeFaces原生jQuery(您知道,PrimeFaces是jQuery / UI之上的JSF组件库)。

    要在load事件中调用它,请设置autoRun="true"

     <p:remoteCommand ... autoRun="true" /> 

  3. 创build一个扩展UICommand的自定义UIComponent ,并生成必要的JSF原生jsf.ajax.request()调用。 然后,您将重新创build<p:remoteCommand>来使用本机JSF ajax而不是jQuery。 JSF实用程序库OmniFaces有一个<o:commandScript>组件,它正是这样做的。 另请参阅展示和源代码 。

     <h:form> <o:commandScript name="commandName" action="#{bean.action}" render=":results" /> </h:form> <h:panelGroup id="results"> ... </h:panelGroup> 

    你可以在JS中调用它,如下所示:

     commandName(); 

    要在load事件中调用它,请设置autorun="true"

     <o:commandScript ... autorun="true" /> 

  4. 升级到JSF 2.3并使用本地的<h:commandScript>组件。 从2.3.0-m06开始可用。 语法与上面的<o:commandScript>完全相同。 只需要将o:replace成h: