【问题标题】:jsf ajax call: executing javascript function in the endjsf ajax调用:最后执行javascript函数
【发布时间】:2012-05-23 05:59:54
【问题描述】:

我正在使用 JSF 2.0,这是我的表单:

<h:form id="fff" onsubmit="reloadMap();">
    <h:selectOneMenu value="#{rentCarPoolBean.state}">
        <f:selectItems value="#{rentCarPoolBean.stateList}" id="stateList" />
        <f:ajax event="change" render="cities stateSelected" onevent="showAlert"/>
    </h:selectOneMenu>
    <h:selectOneMenu  id="cities" value="#{rentCarPoolBean.city}">
        <f:selectItems value="#{rentCarPoolBean.cityList}"/>
        </h:selectOneMenu>
    <h:outputText value="#{rentCarPoolBean.state}" id="stateSelected" />
</h:form>

还有javascript函数:

<script type="text/javascript">
    function showAlert(data){
         if (data.status == "complete")
             alert(document.getElementById("stateSelected"));   
    }
</script>

上面的代码所做的是从第一个下拉列表中选择一个状态,它进行 ajax 调用并呈现“城市”下拉列表和“stateSelected”输出文本。

此外,它还调用 showAlert() javascript 函数。

我想要做的是在返回所有数据并且下拉和 outputText 都已呈现后调用 javascript 函数。

但目前在渲染元素之前调用 javascript 函数并且警报显示null。 我们到底如何让javascript函数执行?

【问题讨论】:

    标签: javascript ajax jsf-2


    【解决方案1】:

    这里:

    alert(document.getElementById("stateSelected"));
    

    您只指定了 JSF 组件 ID,但您需要提供完整的 clientId。这是 link 解释这一点。

    【讨论】:

      【解决方案2】:

      您需要挂钩success 的状态。这将在 HTML DOM 树更新后运行。 complete 的状态在 ajax 响应返回后直接运行。这无疑是一个误导性的状态名称,但您应该尝试在“HTTP 请求”的上下文中解释它,例如 begin 状态。

      另一个问题是document.getElementById() 通过 HTML 元素 ID 选择项目,而不是通过 JSF 组件 ID。您需要准确地给它提供 JSF 为 HTML 生成的 ID。您可以通过在 webbrowser 中查看页面源来确定正确的 HTML 元素 ID。

      总而言之,您的新函数应该如下所示:

      function showAlert(data){
           if (data.status == "success")
               alert(document.getElementById("fff:stateSelected"));  
      }
      

      【讨论】:

      • 已经尝试过completesuccess。两者都给出相同的结果。
      • 我再次检查了您的代码。 timeResult 标识的组件在哪里?是否在同一个表格内?
      • document.getElementById("fff:stateSelected") 返回null,因为生成的id是j_idt6:fff。我们如何在javascript函数中获取这个id?
      • 您需要在生成的HTML源代码中查找带有id="j_idt6"的HTML元素,然后在JSF源代码中为此Trackback负责的JSF组件,然后给它一个固定的JSF组件ID。 HTML 元素 ID 也将固定为该值。前置客户端 ID 的 JSF 组件都是 UINamingContainer 组件,如 &lt;h:form&gt;&lt;f:subview&gt;&lt;h:dataTable&gt;&lt;ui:repeat&gt; 等。如果你的组件是另一个 &lt;h:form&gt;,那么你还有另一个问题:嵌套表单是非法的。
      • 我在表单对象上添加了prependId="false" 属性。现在元素 id 是我在定义它们时设置的普通 id :)
      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 2020-01-31
      • 2014-06-10
      • 1970-01-01
      • 2023-03-29
      • 2012-05-08
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多