2010-12-10 13 views
18

Necesito crear una función en un carro de compras que utiliza AJAX para recuperar una copia actualizada de la plantilla del servidor cuando algo cambia (por ejemplo, se elimina un producto). No puedo modificar el código del lado del servidor, o el JavaScript que hace que el carro de compras funcione en primer lugar. (No es lo ideal, lo sé, pero así es)¿Puede JQuery escuchar llamadas AJAX desde otro javascript?

Lo que quiero hacer es ejecutar mi propio JavaScript cada vez que el carrito se actualice. Quiero saber si es posible escuchar las llamadas AJAX, y ejecutar mi código cada vez que se realiza una.

+0

@budgieln, si está utilizando jQuery que me haga saber, se puede utilizar hanldler éxito o ajax o métodos ajaxComplelte – kobe

+0

que estoy usando jQuery, pero las llamadas AJAX originales no se hacen usando jQuery. – BudgieInWA

Respuesta

29

Es una vieja pregunta, pero tal vez esta respuesta puede ayudar a los demás.

Para seguir todas las llamadas ajax en un documento HTML, puede sobrescribir el prototipo XMLHttpRequest. De esta manera, puede ver las acciones sobre los métodos de los objetos XMLHttpRequest.

Aquí hay un pequeño código de ejemplo:

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; 

Con esta muestra, para cada AJAX llame tendrá una advertencia en la consola de JavaScript.

No es una secuencia de comandos jQuery, pero puede usar jQuery dentro como lo desee.

Esta solución probablemente no funcionará en IE 6 o más, pero funciona en FF, IE7 +, Chrome, Opera, Safari ...

+0

Aventuras locas, esto es exactamente lo que estaba esperando. No sabía sobre el método 'apply' y esa es una forma inteligente de sobreescribir la función sin dejar de hacer referencia al original. Hace tiempo que terminé el proyecto que requería esto, ¡pero lo sé! – BudgieInWA

+0

pregunta tonta: ¿cómo se escucha el evento de recepción (onreadystate?) No puedo hacer que esto funcione, pero sería el único evento que necesito. su código propuesto funciona como un encanto, ¡gracias por eso! –

+0

@michapixel: para poder detectar eventos Readystate, también puede anular la propiedad "onreadystatechange". Voy a editar mi código para agregar esta anulación – Nicolas

2

No puede escucharlo, pero puede usar un complemento de actualización periódica. Mira el siguiente:

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

¿Cuál es su base para decir que no puede escuchar, vea Mi respuesta –

6

prefiero esta solución.

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

mi amigo Esto se puede hacer muy fácilmente con jQuery (como usted ha dicho que está utilizando jQuery)

(Para aquellos que no están utilizando pueden conducir en código de la biblioteca jQuery bajo la función ajax a ver código nativo: '))

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

Este es un fragmento de código tomado de documentos oficiales jQuery api (Véase la Sección Eventos Global)

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

+0

Por lo que puedo decir, esto solo escucha las llamadas AJAX realizadas por jQuery. Las solicitudes de AJAX a las que deseo responder en la pregunta están hechas por algún código no relacionado. – BudgieInWA

+0

sí, usted tiene razón, pero qué tan grande es su archivo que contiene el código no relacionado –

+0

No es mío. Fundamental para la pregunta es el hecho de que no puedo cambiar el código que está haciendo las solicitudes. Además, otra solución funciona. – BudgieInWA

Cuestiones relacionadas