2010-02-12 3 views
6

J'essaye de surcharger la méthode XMLHttpRequest. * En JavaScript afin qu'une page web puisse déterminer si une requête Ajax a eu lieu sans utiliser de callback intrusif. Maintenant, quelque chose comme cela fonctionne relativement bien en utilisant la plupart des cadres JS:Déterminer quand une requête XMLHttpRequest a été effectuée sans rappels

XMLHttpRequest.prototype.getResponseHeader = function() { 
alert('O hai, looks like you made an AJAX request.'); 
} 

Cependant, il y a deux prises:

  • getResponseHeader ne peut pas être utilisé comme getResponseHeader plus.
  • Cela ne fonctionne pas dans les exemples AJAX simples. à savoir xmlhttp.open("GET","simple.html",false);

Est-il possible JS peut refléter XMLHttpRequest.open() ou de toute façon que je peux chaîne quelque chose. J'ai essayé un million de paradigmes (l'usine, le clonage, l'emballage - la plupart aboutissant à une récursion infinie) et rien ne semble fonctionner. Peut-être que c'est juste impossible. Des idées?

Répondre

2

Vous pouvez conserver une référence à la dans une variable d'origine avant de passer outre la méthode, puis appelez cette variable au sein de la fonction redéfini:

var temp = XMLHttpRequest.getResponseHeader; 
XMLHttpRequest.getResponseHeader = function() { temp.apply(this, arguments); }; 

Cela devrait vous permettre de suivre les utilisations sans écraser les fonctionnalités fournies par la fonction originale.

+1

le temp comme paramètre à appliquer devrait être 'ceci' pour maintenir la portée de l'appel original –

+0

Il serait également préférable de créer ceci dans une fonction pour que la variable' temp' ne soit pas placée dans la portée globale – AnthonyWJones

+0

Merci Gaby, j'ai modifié pour refléter cela. Et Anthony: J'essaie toujours de minimiser les globales, mais comme je n'avais besoin que de 2 lignes de code pour illustrer je ne voulais pas compliquer les choses – Bob

0

XmlHttp va être un vrai problème, c'est un objet COM et ne supporte pas le genre de manipulation de prototype que vous voulez utiliser. Pire encore, JQuery évite XmlHttpRequest dans IE même si c'est disponible, il utilise XmlHttp à la place.

+0

A propos de jQuery utilisant toujours un objet ActiveX dans IE, même si 'XMLHttpRequest' est disponible: non vrai, il ne le fait que si le fichier' protocol == ":" '. –

Questions connexes