在ajax调用<f:ajax>之后处理onclick函数
提交表单(ajax调用)后,我正在尝试select并重点select组件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>
此解决scheme正在工作,但问题是, <f:ajax>
被称为AFTER onclick
,所以表单在组件select后呈现,焦点被清除。
如何在表单呈现后调用我的函数?
更新:(我已经尝试过)
- add
onevent="myFunc();"
到f:ajax
=>导致刷新页面 - 将
onevent="myFunc()"
到f:ajax
=>与onclick
属性相同的行为 - 下一个
f:ajax
与一个attr的f:ajax
。 =>仍然是一样的
更新2 (它应该如何工作):
- 提交button是ajax调用
- 表格根据需要进行清理
- 集中适当的领域(取决于一些用户select的因素)
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" />