Primefaces:所有ajax请求的默认oncomplete方法

时间:2013-02-08 02:10:22

标签: ajax jquery primefaces

我正在尝试为所有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';
    }
});

任何帮助将不胜感激

3 个答案:

答案 0 :(得分: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但只有旧版本.. 希望有人觉得这很有用。

答案 1 :(得分: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);
   };

答案 2 :(得分:2)

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

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

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

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

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