我需要在购物车中构建一个功能,当某些功能发生变化(例如产品被移除)时,使用AJAX从服务器检索模板的更新副本。我无法修改服务器端代码,或首先使购物车工作的JavaScript。 (不理想我知道,但事实就是这样)JQuery可以监听来自其他javascript的AJAX调用吗?
我想要做的是每次购物车更新时运行我自己的JavaScript。 我想知道是否有可能侦听AJAX调用,并在每次执行代码时运行我的代码。
我需要在购物车中构建一个功能,当某些功能发生变化(例如产品被移除)时,使用AJAX从服务器检索模板的更新副本。我无法修改服务器端代码,或首先使购物车工作的JavaScript。 (不理想我知道,但事实就是这样)JQuery可以监听来自其他javascript的AJAX调用吗?
我想要做的是每次购物车更新时运行我自己的JavaScript。 我想知道是否有可能侦听AJAX调用,并在每次执行代码时运行我的代码。
这是一个古老的问题,但也许这个答案可以帮助别人。
要遵循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浏览器的工作原理...
疯狂的道具,这正是我所希望的。我不知道'apply'方法,这是覆盖函数的一种巧妙方式,同时仍然引用原始方法。我很早就完成了这个项目,但我知道! – BudgieInWA 2011-05-22 04:11:45
你不能听它,但你可以使用定期更新插件。看看下面:
http://plugins.jquery.com/plugin-tags/periodic-updater
你说什么你不能听我的答案 – 2015-09-25 05:51:48
我喜欢这个解决方案。
$(document).ajaxComplete(function(event,request, settings){
// Your code here
});
我的朋友您可以用jQuery做到这一点很容易(因为你已经告诉您正在使用jQuery)
(对于谁是不使用它们可以在jQuery库代码驱动下AJAX功能的查看本机代码:'))
$(document).bind("ajaxSend", function(){
$("#loading").show();
}).bind("ajaxComplete", function(){
$("#loading").hide();
});
这是来自官方的jQuery API文档拍摄的代码段(见全球活动节)
@budgieln,如果你正在使用jQuery让我知道,你可以使用成功hanldler或AJAX或ajaxComplelte方法 – kobe 2010-12-10 07:34:20
我使用jQuery,但使用jQuery原来的AJAX调用都不能进行。 – BudgieInWA 2010-12-10 07:45:03