11

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

我在 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);
                    }
                }
            });
    }
}
4

1 回答 1

24

附加到onevent属性的函数实际上将被调用3次。一次是在发送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.
    }
}
于 2012-07-05T19:29:02.780 回答