JQUERY或JS有没有办法检测Window加载的时间?基本上任何网络活动?

时间:2010-04-14 02:25:07

标签: javascript jquery networking loading

有没有办法使用JQUERY或Javascript,可以随时检测浏览器窗口正在加载某些东西,进行ajax调用,加载图像等等......基本上是任何网络活动?

3 个答案:

答案 0 :(得分:3)

这个jQuery(放在HEAD中)的东西应该可以工作。

var loading = true;

$(window).load(function () {
   loading = false;
}).ajaxStart(function () {
   loading = true;
}).ajaxComplete(function () {
   loading = false;
});

阅读ajaxStart了解更多详情。

答案 1 :(得分:2)

我在下面的回答和之前用户的回答只是试图检查浏览器当前是否正在发出XmlHttpRequest(即ajaxy)请求。 您询问是否可以判断浏览器是否正在发出任何网络请求(即下载images / css或者可能是长期运行的'comet'请求)。我不知道有任何javascript API可以告诉你 - 它们可能存在,但我怀疑如果他们这样做,那么它们将是浏览器特定的[如果有人知道答案,请填写]。显然像Firebug和dynaTrace这样的工具可以检测网络活动,但我认为这些工具比javascript代码更深入地浏览到浏览器。

说了这么多,如果你想计算jQuery产生的XHR,那么dave1010的答案看起来很好。

但是我觉得它很容易出现一些竞争问题: -

根据文档(http://api.jquery.com/ajaxStart/

  

每当要发送Ajax请求时,jQuery都会检查是否还有其他未完成的Ajax请求。如果没有进行,jQuery会触发ajaxStart事件。已经使用.ajaxStart()方法注册的任何和所有处理程序都会在此时执行。

因此,如果一个长时间运行的XHR已经启动而另一个XHR在第一个完成之前就已经启动,那么ajaxStart处理程序只会被调用一次。第二个XHR可以在第一个XHR之前完成并设置loading = false,即使第一个请求仍在进行中。

查看jQuery 1.4源代码似乎证实了这一点。有趣的是,jQuery 1.4有一些活跃的XHR(jQuery.active),但在文档中没有提到,因此最好不要使用它(这很可惜,因为它会让生活变得更容易)。

有关在调用ajaxStart处理程序之前检查$ .active为0的代码,请参阅http://gist.github.com/277432#LID5052

[我认为]'ajaxSend'全局事件处理程序在每个XHR之前被调用。使用它优先于'ajaxStart'应该有所帮助,但我们仍然需要保留活动请求的数量,而不是简单的“加载”标志。

也许以下内容可行?

var activeXhrCount = 0;
$(document).ajaxSend(function() {activeXhrCount++;}).ajaxComplete(function(){activeXhrCount--;});

请注意,如果任何代码在全局选项设置为false的情况下调用$ .ajax,那么这将给出错误答案,因此几乎不能防弹;

另请注意,activeXhrCount仅计算由jQuery生成的XHR - 您可能使用的其他库中的XHR将不计算在内。

答案 2 :(得分:1)

我认为你必须通过自己建立一些思考, 我之前做过类似的事情[比如当gmail显示加载在那里]

这个想法是关于创建一个数组然后添加/删除它并继续检查它是否知道是否存在打开的连接

代码看起来应该是这样的

var liveAjax = [];

//making ajax call
liveAjax[liveAjax.length] = true;
$.ajax({
  url: 'ajax/test.html',
  success: function(data) {
    liveAjax[liveAjax.length] = false;
    or delete liveAjax[liveAjax.length]
  }
});


then checking the alive calls by
setInterval(function(){
//looping in liveAjax  and check if there any true value, then there is ajax call elese nothing happens
},200);