这是我第一次在论坛上提问,因为通常我的问题已经被提问和回答了。我还没有找到适合我的这个问题的答案,所以这里是:
我在 JSF 2.0 中进行 Ajax 调用,如下所示:
< f :ajax listener="#{myReferenceController.clearRequiredReferenceNumber}"
onevent="resetFocus" execute="@form"
render=":resultsForm:ResultsDisplay" />
侦听器中的所有内容都运行良好,然后在我的 .xhtml 页面中的数据表中按预期呈现数据。问题是我调用的 Javascriptonevent
似乎在渲染完成之前被调用,因此将焦点重置到我的列的过程datatable
不起作用,因为datatable
删除然后重新添加到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);
}
}
});
}
}