4

我正在尝试为所有 ajax 请求配置一个 oncomplete 方法,以便我可以处理会话超时。

我尝试添加以下脚本,但它与为 p:ajax 元素设置 oncomplete 属性的方式不同。它不会在每次发出 Ajax 请求时执行。

$.ajaxSetup({method: post,
    complete: function(xhr, status, args){
        var xdoc = xhr.responseXML;
        if(xdoc == null){
            return;
        }
        errorNodes = xdoc.getElementsByTagName('error-name');

        if (errorNodes.length == 0) {
            return;
        }

        errorName = errorNodes[0].childNodes[0].nodeValue;
        errorValueNode = xmlDoc.getElementsByTagName('error-message');
        errorValue = errorValueNode[0].childNodes[0].nodeValue;

        alert(errorValue);
        document.location.href='${pageContext.request.contextPath}/login/login.jsf';
    }
});

任何帮助,将不胜感激

4

3 回答 3

6

PrimeFaces 较新版本(此处使用 PF 5)

var originalPrimeFacesAjaxUtilsSend = PrimeFaces.ajax.Request.send;
PrimeFaces.ajax.Request.send = function(cfg) {
    if (!cfg.oncomplete) {
        cfg.oncomplete = doYourStuff;
    }
    originalPrimeFacesAjaxUtilsSend.apply(this, arguments);
};

只是为了把它保存在某个地方,试图在stackoverflow上找到但只有旧版本..希望有人觉得这很有用。

于 2014-05-22T17:04:15.613 回答
5

我设法通过包装 Primefaces AjaxUtils 方法来实现这一点。

var originalPrimeFacesAjaxUtilsSend = PrimeFaces.ajax.AjaxUtils.send;

   PrimeFaces.ajax.AjaxUtils.send = function(cfg) {
      if (!cfg.oncomplete) {
         // register default handler
         cfg.oncomplete = oncompleteDefaultHandler;
      }
      originalPrimeFacesAjaxUtilsSend.apply(this, arguments);
   };
于 2013-02-08T21:17:50.067 回答
2

在 primefaces 中有ajaxStatus一个可以用于此目的的组件。阅读文档以查看有关它的更多详细信息,但对于您的用例,它可能是这样的:

<p:ajaxStatus oncomplete="ajaxStatusHandler(xhr, status, args)"/>

您可以按原样使用您的 JavaScript 函数:

function ajaxStatusHandler(xhr, status, args) {
  // your code ...
}

注意:此方法仅可用于全局 AJAX 请求(PrimeFaces 中的默认设置),而且据我所知,跨域脚本或JSONP(带填充的 JSON)请求不能是全局的。

于 2013-02-08T10:51:48.317 回答