6

提交表单(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=> 导致刷新页面
  • 添加onevent="myFunc()"到=> 与属性f:ajax相同的行为onclick
  • 接下来f:ajaxoneventattr。=> 还是一样

update2(它应该如何工作):

  • 提交按钮是ajax调用
  • 根据需要清洁表格
  • 专注于适当的领域(取决于一些用户选择的因素)
4

1 回答 1

26

处理程序实际上会被调用 3次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" />
于 2012-11-24T11:48:12.527 回答