2010-12-10 100 views
18

我需要在购物车中构建一个功能,当某些功能发生变化(例如产品被移除)时,使用AJAX从服务器检索模板的更新副本。我无法修改服务器端代码,或首先使购物车工作的JavaScript。 (不理想我知道,但事实就是这样)JQuery可以监听来自其他javascript的AJAX调用吗?

我想要做的是每次购物车更新时运行我自己的JavaScript。 我想知道是否有可能侦听AJAX调用,并在每次执行代码时运行我的代码。

+0

@budgieln,如果你正在使用jQuery让我知道,你可以使用成功hanldler或AJAX或ajaxComplelte方法 – kobe 2010-12-10 07:34:20

+0

我使用jQuery,但使用jQuery原来的AJAX调用都不能进行。 – BudgieInWA 2010-12-10 07:45:03

回答

29

这是一个古老的问题,但也许这个答案可以帮助别人。

要遵循HTML文档上的所有ajax调用,可以覆盖XMLHttpRequest原型。 这样,您可以观察对XMLHttpRequest对象的方法的操作。

这里是一个小样本代码:

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; 

有了这个样本,对于每一个AJAX调用你必须在JavaScript控制台的警告。

这不是jQuery脚本,但你可以根据需要在里面使用jQuery。

该解决方案可能不会对IE 6或更早的版本,但它在FF,IE7 +,铬,歌剧,Safari浏览器的工作原理...

+0

疯狂的道具,这正是我所希望的。我不知道'apply'方法,这是覆盖函数的一种巧妙方式,同时仍然引用原始方法。我很早就完成了这个项目,但我知道! – BudgieInWA 2011-05-22 04:11:45

2

你不能听它,但你可以使用定期更新插件。看看下面:

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

你说什么你不能听我的答案 – 2015-09-25 05:51:48

6

我喜欢这个解决方案。

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

我的朋友您可以用jQuery做到这一点很容易(因为你已经告诉您正在使用jQuery)

(对于谁是不使用它们可以在jQuery库代码驱动下AJAX功能的查看本机代码:'))

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

这是来自官方的jQuery API文档拍摄的代码段(见全球活动节)

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

相关问题