【发布时间】:2012-07-06 05:42:10
【问题描述】:
这是我第一次在论坛上提问,因为通常我的问题已经被提问和回答了。我还没有找到适合我的问题的答案,所以这里是:
我在 JSF 2.0 中进行 Ajax 调用,如下所示:
< f :ajax listener="#{myReferenceController.clearRequiredReferenceNumber}"
onevent="resetFocus" execute="@form"
render=":resultsForm:ResultsDisplay" />
侦听器中的所有内容都运行良好,然后按预期在我的 .xhtml 页面中的数据表中呈现数据。问题是我在onevent 中调用的Javascript 似乎在渲染完成之前被调用,因此将焦点重置到我的datatable 中的列的过程不起作用,因为@987654327 @ 被删除,然后在 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);
}
}
});
}
}
【问题讨论】:
-
这看起来像是你的 ajax 请求的
oncompletejavascript 方法。遗憾的是,此方法不在 JSF 规范中(有关它的更多信息 here)。或者,您可以使用PrimeFaces 或RichFaces,这些框架处理这个oncomplete方法来处理ajax 请求。 -
如果这个 oncomplete 方法只是处理事件侦听器传递的属性状态,我认为这对我没有帮助。在 ajax 和 jsf 完成渲染之前,甚至“成功”状态似乎又回来了。不过,我会调查一下主要面孔和富人的途径.....
标签: java javascript jsf-2 dojo