我希望能够将脚本注入(inject)到页面中,该页面将检测是否仍在“进行中”。当我说继续时,我的意思是脚本仍在执行中,Ajax正在调用中,或者页面尚未完全加载。原因是我需要检查各种元素是否存在(通过JQuery),然后对其进行处理。我正在尝试使其尽可能通用,因为我已将其注入(inject)到包含各种内容的页面中。

显然使用.ready会告诉我页面何时加载:

 $( document ).ready(function() {...}); //Super easy!

而且我可以检测到Ajax调用是否正在进行,例如:
var AjaxInProgress= function (){return jQuery.active!=0;};

$( document ).ajaxStart(function() {
  console.log('Ajax stuff happening!');
});
$( document ).ajaxStop(function() {
  console.log('Ajax stuff finished!');
});

但是...如果这些Ajax调用同步发生,我会得到如下结果:
 Ajax stuff happening!
 Ajax stuff finished!
 Ajax stuff happening!
 Ajax stuff finished!
 Ajax stuff happening!
 Ajax stuff finished!
 Ajax stuff happening!
 Ajax stuff finished!

因此,显然有JavaScript在每个Ajax调用之前等待结果,然后再触发另一个,并且在前几个调用之后我得到了“假阳性”,因为还有更多事情要做。

有没有一种方法可以笼统地检测所有脚本是否都已执行并且没有什么等待Ajax响应?显然,任何解决方案都必须避免出现竞争状况,并且不能满足长时间的轮询。

最佳答案

我已经做过一段时间了。看一下此链接:http://api.jquery.com/jQuery.when/

基本上,这样做:

var xhr1 = $.ajax( "/page1.php" );
var xhr2 = $.ajax( "/page2.php" );
$.when( xhr1 , xhr2 )
     .then( myFunc, myFailure );

如果两个ajax请求均成功,则将执行函数myFunc;如果其中一个出错,则将执行myFailure。

09-30 16:27
查看更多