我必然会使用本机javascript(尽管如果我将它转换为原生javascript,jQuery解决方案也可以工作)。
另外,我没有现有AJAX请求的句柄,所以我无法直接访问它们。
我正在寻找类似的东西:
var ajaxRequestsInProgress = document.getAllAjaxRunning();
ajaxRequestsInProgress[1].getStatus(); // will return the status of the request, for example
所以我可以访问这个对象并检查/操作现有的ajax请求。
答案 0 :(得分:7)
我们应该说,这有点棘手。没有本地方法可以做到这一点。所以我们需要做一些黑客攻击,修改本地XMLHttpRequest
函数。像这样:
var getAJAXRequests = (function() {
var oldSend = XMLHttpRequest.prototype.send,
currentRequests = [];
XMLHttpRequest.prototype.send = function() {
currentRequests.push(this); // add this request to the stack
oldSend.apply(this, arguments); // run the original function
// add an event listener to remove the object from the array
// when the request is complete
this.addEventListener('readystatechange', function() {
var idx;
if (this.readyState === XMLHttpRequest.DONE) {
idx = currentRequests.indexOf(this);
if (idx > -1) {
currentRequests.splice(idx, 1);
}
}
}, false);
};
return function() {
return currentRequests;
}
}());
可以使用getAJAXRequests()
调用它。
您可以在行动on jsFiddle中看到它。
答案 1 :(得分:-2)
我知道你并没有特别要求Mootools
解决方案,但我做过类似的事情,我认为我会在这里与其他人分享。参考。我通过覆盖各种请求方法来实现这一点。我目前正在使用1.5.1版,但是这个或类似的东西应该适用于其他版本。
(function() {
var requestCounter = 0,
send = Request.prototype.send,
cancel = Request.prototype.cancel,
onSuccess = Request.prototype.onSuccess,
onFailure = Request.prototype.onFailure,
timeout = Request.prototype.timeout;
var increment = function() {
++requestCounter;
};
var decrement = function() {
--requestCounter;
if (requestCounter < 0) {
requestCounter = 0;
}
};
Request.implement({
send: function() {
increment();
return send.apply(this, arguments);
},
cancel: function() {
decrement();
return cancel.apply(this, arguments);
},
onSuccess: function() {
decrement();
return onSuccess.apply(this, arguments);
},
onFailure: function() {
decrement();
return onFailure.apply(this, arguments);
},
timeout: function() {
decrement();
return timeout.apply(this, arguments);
}
});
Request.getRunningCount = function() {
return requestCounter;
};
})();
现在每次发出请求时,计数器都会递增,当它完成时,它会递减。
var request1 = new Request(...);
var request2 = new Request(...);
request1.send();
request2.send();
console.log(Request.getRunningCount()); // 2
request1.cancel();
console.log(Request.getRunningCount()); // 1
// request2 completes
console.log(Request.getRunningCount()); // 0