Saltar al contenido

¿Interceptar todas las llamadas ajax?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *