有没有一种简单的方法可以检测在浏览器窗口中是否存在活动的XMLHttpRequest
?或者有多少个活动的XMLHttpRequest?也就是说,是否有一种方法可以检测我的浏览器窗口中是否有任何活动的AJAX调用?
问题的扩展:使用javascript,我能否看到是否有任何XMLHttpRequest处于打开状态?例如"window.XMLisActive()"
之类的东西?
解决方案:最终编写了一个XMLHttpRequest
的包装器:这里是gist
有没有一种简单的方法可以检测在浏览器窗口中是否存在活动的XMLHttpRequest
?或者有多少个活动的XMLHttpRequest?也就是说,是否有一种方法可以检测我的浏览器窗口中是否有任何活动的AJAX调用?
问题的扩展:使用javascript,我能否看到是否有任何XMLHttpRequest处于打开状态?例如"window.XMLisActive()"
之类的东西?
解决方案:最终编写了一个XMLHttpRequest
的包装器:这里是gist
除非您编写一个包装XmlHttpRequest
(或猴子补丁它)来跟踪打开的连接,否则无法检测JS中的打开连接。
这里是kidcapital的猴子补丁,不确定它是否完美,但它是一个好的开始。
(function() {
var oldOpen = XMLHttpRequest.prototype.open;
window.openHTTPs = 0;
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
window.openHTTPs++;
this.addEventListener("readystatechange", function() {
if(this.readyState == 4) {
window.openHTTPs--;
}
}, false);
oldOpen.call(this, method, url, async, user, pass);
}
})();
注意
这并不处理fetch
或WebSockets,但在这些情况下,你可以做类似的事情。
abort()
函数是否被调用。 - Ruan MendessetInterval
调用注入此代码,每秒记录一次变量,它可以正常工作而不会出现任何问题。因此,它不应该破坏任何应用程序。如果确实有问题,熟悉js调试的开发人员应该再次检查它... :) 我们将测试这种方法以进行测试自动化,以便能够知道当前是否没有打开任何ajax请求,或者在所有请求都已完成时进行通知... - Martin我尝试了@juan-mendes的解决方案,但是出现了错误:ERROR Error Code: undefined Message: Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be changed for synchronous requests made from a document.
在我的Angular应用程序中。原因是async
参数默认为true,但当缺少该参数时,此补丁会传递undefined
,而这相当于false。带有此小更改的代码对我有效:
(function() {
var oldOpen = XMLHttpRequest.prototype.open;
window.openHTTPs = 0;
XMLHttpRequest.prototype.open = function(method, url, async = true, user = null, pass = null) {
window.openHTTPs++;
this.addEventListener("readystatechange", function() {
if(this.readyState == 4) window.openHTTPs--;
}, false);
oldOpen.call(this, method, url, async, user, pass);
}
})()
XmlHttpRequest
的包装器,那么很容易实现(如果你的包装器支持它的话)。如果你没有 jQuery,你可以开始使用它,或者编写自己的包装器。 - Ruan Mendes