如何创建一些ajax调用完成后触发的事件?

时间:2010-11-29 13:33:08

标签: javascript jquery ajax javascript-events event-handling

请帮助我为我的情况创造正确的活动。我相信有 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) {};

3 个答案:

答案 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()
{}