在jsf 2.0(myfaces)中调用ajax,在渲染完成之前调用ajax标记中的一个Javascript函数

这是我第一次在论坛上提问,因为我的问题通常已经被问及并得到了解答。 我还没有找到适合我的这个问题的答案,所以这里有:

我在JSF 2.0中进行Ajax调用,如下所示:

 

侦听器中的所有内容都能正常工作,然后数据会在我的.xhtml页面中的数据表中按预期呈现。 问题是我在onevent调用的Javascript似乎在渲染完成之前被调用,因此将焦点重置到我的数据表中的列的过程不起作用,因为数据表被删除然后重新 – 当Ajax完成重新渲染时添加到DOM。

我正在查看我的Javascript中的“成功”状态,希望此时渲染已经完成。 唉,事实并非如此,我的getElementById (实际上是dojo.byId )没有找到数据表中的元素。 我知道我的Javascript函数在正常情况下工作,因为我在没有Ajax调用的情况下调用同一个函数,并且一切都在那里完美运行。

如果我可以避免渲染我正试图设置焦点的表格中的单元格,那将是很好的,但我的听众正在ajax调用中对此单元格进行更改。 我在我的智慧结束,所以对此的任何想法都将非常感激。

– 回应Balusc(听到关于你的好消息,顺便说一句)

嗯,我认为我实际上是在正确的轨道上,但似乎仍然有麻烦。 我正在检查“成功”,甚至还是成功,我无法将重点放在这里。 这是检查“成功”的我的Javascript函数:此函数在另一种情况下工作,它没有附加到Ajax事件。

 function resetFocus(data) { var theRow = dojo.byId("resultsForm:selectedRow").value; if (data.status == "success") { dojo.query('[widgetId]',dojo.byId('theResultsDataTable')) .forEach(function(node) { var widget = dijit.byNode(node); var theId = widget.attr("id") if (theId.indexOf(':' + theRow + ':') != -1) { if (theId.indexOf('theOrppoNum') != -1) { widget.focus(); widget.attr("isFocused",true); } } }); } } 

附加到onevent属性的函数实际上将被调用三次。 在发送ajax请求之前,有一次是在ajax响应到达之后,有一次是在成功更新HTML DOM之后。 您应该检查给定数据参数的status属性。

 function onEventFunction(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 resetFocus(data) { if (data.status == "success") { // Do your job here. } }