Solución:
Si está usando jQuery, $.ajaxSuccess
es una buena opción, pero aquí hay una opción un poco más genérica que interceptará las llamadas XHR de todos los marcos (lo he probado con ExtJS y jQuery; debería funcionar incluso si se cargan varios marcos al mismo tiempo). Ha sido probado para funcionar con IE8, Chrome y Firefox.
(function(XHR) {
"use strict";
var open = XHR.prototype.open;
var send = XHR.prototype.send;
XHR.prototype.open = function(method, url, async, user, pass) {
this._url = url;
open.call(this, method, url, async, user, pass);
};
XHR.prototype.send = function(data) {
var self = this;
var oldOnReadyStateChange;
var url = this._url;
function onReadyStateChange() {
if(self.readyState == 4 /* complete */) {
/* This is where you can put code that you want to execute post-complete*/
/* URL is kept in this._url */
}
if(oldOnReadyStateChange) {
oldOnReadyStateChange();
}
}
/* Set xhr.noIntercept to true to disable the interceptor for a particular call */
if(!this.noIntercept) {
if(this.addEventListener) {
this.addEventListener("readystatechange", onReadyStateChange, false);
} else {
oldOnReadyStateChange = this.onreadystatechange;
this.onreadystatechange = onReadyStateChange;
}
}
send.call(this, data);
}
})(XMLHttpRequest);
Publiqué un ejemplo más específico en github que intercepta las llamadas AJAX y envía las duraciones de las llamadas AJAX al servidor para su análisis estadístico.
El código javacript sin procesar para interceptar llamadas ajax:
(function(send) {
XMLHttpRequest.prototype.send = function(body) {
var info="send datarn"+body;
alert(info);
send.call(this, body);
};
})(XMLHttpRequest.prototype.send);
El código jQuery para interceptar ajax:
$.ajaxSetup({
beforeSend: function (xhr,settings) {
alert(settings.data);
alert(settings.url);
}
});
Referencia: http://myprogrammingnotes.com/intercept-ajax-calls-jquery.html
De http://api.jquery.com/ajaxSuccess/:
Siempre que una solicitud Ajax se completa con éxito, jQuery activa el evento ajaxSuccess. Todos y cada uno de los controladores que se han registrado con el método .ajaxSuccess () se ejecutan en este momento.
Entonces, el selector no define la posición en la que está “capturando” el evento (porque, honestamente, el evento ajax por su naturaleza no comienza desde un elemento DOM), sino que define un alcance en el que el manejo será predeterminado ( es decir this
apuntará a ese / esos elementos).
En resumen, debe ser exactamente lo que desea.