2010-12-10 3 views
18

Je dois créer une fonction dans un panier qui utilise AJAX pour récupérer une copie mise à jour du modèle à partir du serveur lorsque quelque chose change (par exemple, un produit est supprimé). Je ne peux pas modifier le code côté serveur ou le JavaScript qui fait fonctionner le panier en premier lieu. (Pas idéal, je sais, mais c'est comme ça)Est-ce que JQuery peut écouter les appels AJAX d'autres javascript?

Ce que je veux faire est d'exécuter mon propre JavaScript chaque fois que le panier se met à jour. Je veux savoir s'il est possible d'écouter les appels AJAX, et d'exécuter mon code à chaque fois que l'on est fait.

+0

@budgieln, si vous utilisez laissez-moi savoir jquery, vous pouvez utiliser hanldler succès ou ajax ou méthodes ajaxComplelte – kobe

+0

J'utilise jQuery, mais les appels AJAX d'origine ne sont pas en utilisant jQuery. – BudgieInWA

Répondre

29

C'est une vieille question, mais peut-être que cette réponse peut aider les autres.

Pour suivre tous les appels ajax sur un document HTML, vous pouvez remplacer le prototype XMLHttpRequest. De cette façon, vous pouvez surveiller les actions sur les méthodes des objets XMLHttpRequest.

Voici un petit exemple de code:

var open = window.XMLHttpRequest.prototype.open, 
    send = window.XMLHttpRequest.prototype.send, 
    onReadyStateChange; 

function openReplacement(method, url, async, user, password) { 
    var syncMode = async !== false ? 'async' : 'sync'; 
    console.warn(
     'Preparing ' + 
     syncMode + 
     ' HTTP request : ' + 
     method + 
     ' ' + 
     url 
    ); 
    return open.apply(this, arguments); 
} 

function sendReplacement(data) { 
    console.warn('Sending HTTP request data : ', data); 

    if(this.onreadystatechange) { 
     this._onreadystatechange = this.onreadystatechange; 
    } 
    this.onreadystatechange = onReadyStateChangeReplacement; 

    return send.apply(this, arguments); 
} 

function onReadyStateChangeReplacement() { 
    console.warn('HTTP request ready state changed : ' + this.readyState); 
    if(this._onreadystatechange) { 
     return this._onreadystatechange.apply(this, arguments); 
    } 
} 

window.XMLHttpRequest.prototype.open = openReplacement; 
window.XMLHttpRequest.prototype.send = sendReplacement; 

Avec cet exemple, pour chaque AJAX que vous appelez aurez un avertissement dans la console javascript.

Ce n'est pas un script jQuery, mais vous pouvez utiliser jQuery comme vous le souhaitez.

Cette solution ne fonctionnera probablement pas sur IE 6 ou plus, mais il fonctionne en FF, IE7 +, Chrome, Opera, Safari ...

+0

Les accessoires fous, c'est exactement ce que j'espérais. Je ne connaissais pas la méthode 'apply' et c'est une façon intelligente d'écraser la fonction tout en référençant l'original. J'ai longtemps terminé le projet qui l'exigeait, mais je sais! – BudgieInWA

+0

Question idiote: comment est-ce qu'on écoute l'événement de réception (onreadystate?) Je n'arrive pas à faire fonctionner ça, mais ce serait le seul événement dont j'ai besoin. votre code proposé fonctionne comme un charme - merci pour cela! –

+0

@michapixel: Pour pouvoir détecter les événements readystate, vous pouvez également remplacer la propriété "onreadystatechange". Je vais éditer mon code pour ajouter cette surcharge – Nicolas

2

Vous ne pouvez pas l'écouter mais vous pouvez utiliser un plugin de mise à jour périodique. Regardez ci-dessous:

http://plugins.jquery.com/plugin-tags/periodic-updater 
+0

Quelle est votre base pour dire que vous ne pouvez pas écouter voir ma réponse –

6

Je préfère cette solution.

$(document).ajaxComplete(function(event,request, settings){ 
    // Your code here 
}); 
2

Mon ami Vous pouvez le faire très facilement avec Jquery (Comme vous l'avez dit que vous utilisez Jquery)

(Pour ceux qui n'utilisent pas, ils peuvent conduire dans le code de la bibliothèque Jquery en fonction ajax à voir le code natif: '))

$(document).bind("ajaxSend", function(){ 
    $("#loading").show(); 
}).bind("ajaxComplete", function(){ 
    $("#loading").hide(); 
}); 

C'est un extrait de code provenant jquery docs api officiel (voir la section global Events)

https://api.jquery.com/Ajax_Events/

+0

Pour autant que je sache, ceci n'écoute que les appels AJAX effectués par jQuery lui-même. Les requêtes AJAX auxquelles je veux réagir dans la question sont faites par un code non apparenté. – BudgieInWA

+0

oui vous avez raison mais quelle est la taille de votre fichier qui contient du code sans rapport –

+0

Ce n'est pas le mien. Fondamental à la question est le fait que je ne peux pas changer le code qui fait les demandes. En outre, une autre solution fonctionne. – BudgieInWA

Questions connexes