在JSF 2.0(MyFaces的)Ajax调用,在阿贾克斯标签的OnEvent JavaScrip

2019-06-26 02:00发布

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

我做在JSF 2.0 Ajax调用是这样的:

< f :ajax listener="#{myReferenceController.clearRequiredReferenceNumber}"
    onevent="resetFocus" execute="@form"
    render=":resultsForm:ResultsDisplay" />

在听者的一切完美的作品,然后将数据呈现为预期中,我有我的.xhtml页面的数据表。 问题是,我在调用JavaScript onevent似乎得到调用之前渲染完成的,因此在我的焦点重置为塔的处理datatable不起作用,因为该datatable被删除,然后重新 - 增加了当阿贾克斯完成重新渲染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);
                    }
                }
            });
    }
}

Answer 1:

连接到该功能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.
    }
}


文章来源: ajax call in jsf 2.0 (myfaces), the onevent Javascript function in the ajax tag gets called before the rendering is complete