2010-11-29 5 views
0

私の状況に適したイベントを作成してください。私はカウンターなし、はそれを行うには 真の方法があると信じている(このような:How to know when all ajax calls are completeいくつかのAjax呼び出しが完了した後にトリガーされたイベントを作成するには?

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) {}; 

答えて

1

もし、何らかの理由であなたはNickが示唆しているように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(); 
      } 
     }); 
}); 

これはのように見える競合状態(最初の記事が2番目のリクエストを要求する前に最初の記事の読み込みが完了したらどうなりますか?)、しかしそれはありません。ブラウザ上のJavaScriptはシングルスレッド(明示的に行う必要があるweb workersの使用を除く)であるため、最初の完了までにリクエストを開始するループを終了します。

+0

ありがとう、今私はカウンターを除いて方法がないと確信しています。 –

1

ありajaxStopグローバルイベントのためにこれは:

$(document).ajaxStop(filterAllArticles); 
次のAjaxのバッチが終了する(任意のより多くのAJAXの活動が後がある場合)、それは実行されませんので、あなたは自分の filterAllArticles方法で .unbind()を呼び出すことができ、それをバインド解除するには、

$(document).unbind("ajaxStop", filterAllArticles); 
+0

ありがとう、ありがたいことに、これらのajaxリクエストのみがある場合はうまく動作します。しかし、イメージギャラリなどのリクエストがあると想像してください。**すべての**リクエストが完了した後にのみ 'ajaxStop'が起動されますが、記事が読み込まれた直後に記事をフィルタリングする必要があります。 –

+0

@pereskokov - 記事だけで必要な場合*同時にリクエスト*がある場合は、カウンターを使用してください。選択肢がありません。 –

+0

ありがとう、今私はカウンターを除いて方法がないと確信しています。 –

1

jQueryはこの動作をサポートしています。 jQueryを使用してajax呼び出しを以下のように行うことができます。このメソッドには成功と失敗の2つのコールバック関数があります。

function loadData() 
{ 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     url: 'methodurl', 
     success: methodSuccedded, 
     error: methodFailure 
    }); 
} 

function methodSuccedded() 
{} 

function methodFailure() 
{} 
+0

ありがとうございますが、私はそれを知っています。私は他人を意味した。 –

関連する問題