请帮助我为我的情况创造正确的活动。我相信有 true way 这样做,没有任何计数器(例如:How to know when all ajax calls are complete)
HTML:
<ul id="links">
<li><a href="1.html">What is Yoda's first name?</a></li>
<li><a href="2.html">Why does Padme die?</a></li>
<li><a href="3.html">Who is Darth Rage?</a></li>
</ul>
<div id="content"></div>
jQuery的:
$('#links a').each(function (index, el) {
url = $(el).attr('href');
$('<div class="article" />').appendTo('#content')
.load(url, function(){
filterOneArticle(this);
});
});
// I want this function run after all articles will be loaded and filtered
$.bind('yepAllArticlesHaveBeenLoaded', filterAllArticles);
filterAllArticles = function() {};
filterOneArticle = function(el) {};
答案 0 :(得分:1)
有一个ajaxStop
全局事件:
$(document).ajaxStop(filterAllArticles);
要取消绑定,以便在下一个ajax批处理完成时不运行(如果以后还有更多ajax活动),您只需在filterAllArticles
方法中调用.unbind()
:
$(document).unbind("ajaxStop", filterAllArticles);
答案 1 :(得分:1)
如果出于某种原因你不想使用ajaxStop
,正如尼克所暗示的那样(也许你担心其他无关的ajax请求会让你失望),你可以跟踪你有多少请求发布并检查每个成功/失败的时间:
var requestCount = 0;
$('#links a').each(function (index, el) {
url = $(el).attr('href');
++requestCount;
$('<div class="article" />').appendTo('#content')
.load(url, function(){
filterOneArticle(this);
--requestCount;
if (requestCount == 0) {
filterAllArticles();
}
});
});
看起来就像它有竞争条件(如果第一篇文章在我们请求第二篇文章之前完成加载怎么办?),但事实并非如此。浏览器上的JavaScript是单线程的(除非你必须明确地使用web workers),所以我们知道我们将完成循环,在第一次完成之前启动请求。
答案 2 :(得分:1)
jQuery支持这种行为。 你可以使用jQuery来执行ajax调用,如下所示。这种方法有两个成功和失败的回调函数。
function loadData()
{
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: 'methodurl',
success: methodSuccedded,
error: methodFailure
});
}
function methodSuccedded()
{}
function methodFailure()
{}