Recréant les fonctionnalités ajaxStart et ajaxComplete de jQuery

J'essaie de reproduire les fonctions de jQuery ajaxComplete et ajaxStart sans jQuery afin qu'elles puissent être utilisées dans n'importe quel environnement sans dépendances de bibliothèque (c'est un cas d'utilisation spécial). Ces fonctions permettent d'appeler un auditeur d'événement avant et après toute demande d'ajax. Dans mon exemple, je les appelle preAjaxListener et PostAjaxListener.

J'essaie de l'accomplir en vous connectant à l'objet XMLHttpRequest et en écrasant / décorant open et send . Oui, je sais que c'est sale.

 XMLHttpRequest.prototype.open = (function(orig){ return function(a,b,c){ this._HREF = b; // store target url return orig.apply(this, arguments); // call original 'open' function }; })(XMLHttpRequest.prototype.open); XMLHttpRequest.prototype.send = (function(orig){ return function(){ var xhr = this; _core._fireAjaxEvents('pre', xhr._HREF); // preAjaxListener fires var rsc = xhr.onreadystatechange || function(){}; // store the original onreadystatechange if it exists xhr.onreadystatechange = function(){ // overwrite with custom function try { if (xhr.readyState == 4){ _core._fireAjaxEvents('post', xhr._HREF); // postAjaxListneer should fire this.onreadystatechange = rsc; } } catch (e){ } return rsc.apply(this, arguments); // call original readystatechange function }; return orig.apply(this, arguments); // call original 'send' function }; })(XMLHttpRequest.prototype.send); 

Je ne veux pas écrire de fonctions wrapper pour faire des requêtes ajax. Je souhaite être connecté à n'importe quelle requête ajax faite par n'importe quelle bibliothèque (ou avec vanilla js) sur la page.

Jusqu'à présent, seule la fonction preAjaxListener fonctionne. Je ne peux pas sembler comprendre pourquoi, mais il semble que onreadystatechange ne soit jamais appelé. Toute recommandation serait grandement appréciée.

Démonstration de travail: http://jsfiddle.net/_nderscore/QTQ5s/

L'utilisation de .onreadystatechange ne fonctionnait pas parce que je .onreadystatechange avec jQuery et que les méthodes ajax de jQuery manipulent et suppriment la propriété onreadystatechange .

Cependant, l'ajout d'un auditeur d'événements pour loadend fonctionne très bien partout mais IE. Pour IE, j'ai configuré plutôt un intervalle – pas la solution optimale, mais cela fonctionne pour mes besoins. Je voulais seulement que ce script fonctionne sur les navigateurs IE8 + et modernes.

 XMLHttpRequest.prototype.send = (function(orig){ return function(){ _core._fireAjaxEvents('pre', this._HREF); if (!/MSIE/.test(navigator.userAgent)){ this.addEventListener("loadend", function(){ _core._fireAjaxEvents('post', this._HREF); }, false); } else { var xhr = this, waiter = setInterval(function(){ if(xhr.readyState && xhr.readyState == 4){ _core._fireAjaxEvents('post', xhr._HREF); clearInterval(waiter); } }, 50); } return orig.apply(this, arguments); }; })(XMLHttpRequest.prototype.send);