在ajax调用<f:ajax> </f:ajax>之后处理onclick函数

时间:2012-11-24 10:23:05

标签: ajax jsf jsf-2

在提交表单(ajax调用)后,我正在尝试选择并关注选择的组件ID。

<script>
var myFunc = function() {
  document.getElementById('form:#{bean.componentId}').focus();
  document.getElementById('form:#{bean.componentId}').select();
};

$(document).ready(function() {
  myFunc();
});
</script>

<h:form id="form">
  <h:commandButton action="#{bean.save}" onclick="return myFunc();" ...>
    <f:ajax execute="@form" render="@form"/>
  </h:commandButton>
  ...
</h:form>

此解决方案正在运行,但问题是,<f:ajax>被称为AFTER onclick,因此在选择组件后呈现表单,并清除焦点。

如何在表单呈现后调用我的函数?

更新(我已尝试过)

  • onevent="myFunc();"添加到f:ajax =&gt;导致刷新页面
  • onevent="myFunc()"添加到f:ajax =&gt;与onclick属性
  • 相同的行为
  • f:ajax下一个onevent attr。 =&GT;

update2 (它应该如何运作):

  • 提交按钮是ajax,名为
  • 表格根据需要进行清洁
  • 关注适当的领域(取决于一些用户选择的因素)

1 个答案:

答案 0 :(得分:24)

onevent处理程序实际上会被调用三次,它应该指向一个函数名,而不是函数本身。在发送ajax请求之前,有一次是在ajax响应到达之后,一次是在成功更新HTML DOM之后。您应该检查给定数据参数的status属性。

function listener(data) {
    var status = data.status; // Can be "begin", "complete" or "success".

    switch (status) {
        case "begin": // Before the ajax request is sent.
            // ...
            break;

        case "complete": // After the ajax response is arrived.
            // ...
            break;

        case "success": // After update of HTML DOM based on ajax response..
            // ...
            break;
    }
}

在您的特定情况下,您只需添加一个检查状态是否为success

function myFunc(data) {
    if (data.status == "success") {
        var element = document.getElementById('form:#{bean.componentId}');
        element.focus();
        element.select();
    }
}

您需要通过名称引用该函数:

<f:ajax ... onevent="myFunc" />