【问题标题】:ajax call in jsf 2.0 (myfaces), the onevent Javascript function in the ajax tag gets called before the rendering is completejsf 2.0 (myfaces) 中的 ajax 调用,在渲染完成之前调用 ajax 标签中的 onevent Javascript 函数
【发布时间】: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 请求的 oncomplete javascript 方法。遗憾的是,此方法不在 JSF 规范中(有关它的更多信息 here)。或者,您可以使用PrimeFacesRichFaces,这些框架处理这个oncomplete 方法来处理ajax 请求。
  • 如果这个 oncomplete 方法只是处理事件侦听器传递的属性状态,我认为这对我没有帮助。在 ajax 和 jsf 完成渲染之前,甚至“成功”状态似乎又回来了。不过,我会调查一下主要面孔和富人的途径.....

标签: java javascript jsf-2 dojo


【解决方案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.
    }
}

【讨论】:

  • 嗯,“成功”的建议被证明是好的。我从来没有怀疑过你 BalusC。我现在唯一的问题是它不能在 IE 中运行,但在 Firefox 中运行良好。奇怪,因为我使用 dojo 来获取我的 javascript 中的元素 - 应该是跨浏览器感知的......
  • 好吧,绝对和道场没有任何关系。我做了一个测试并在 onclick 事件上运行相同的 javascript 代码,没有 ajax。 (当然取出了 if data.status=="success")并且我在我的代码中放置了警报,以显示当 IE 在 ajax 调用后重新渲染表时没有看到数据表,但是看到了数据表没有 ajax 调用时的元素。
  • 好的,我终于解决了我的问题!在所有浏览器中肯定都正确返回了成功。在为每个状态设置一个 javascript 警报后,我看到屏幕在成功警报之前闪烁。然后,当我单击“确定”时,它再次闪烁。问题在于,dojo 还通过将普通 html 元素转换为其 dojo 组件来重新渲染屏幕。所需要的只是通过 dojo.addOnLoad 函数调用来围绕我对 status==success 的检查。现在,所有浏览器都能正确处理这个问题!感谢您在这里提供的所有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2011-12-12
相关资源
最近更新 更多