2012-01-06 10 views
0

複数の選択が有効になっている選択メニューがあります。私はクリックイベントハンドラを送信ボタンに設定しているので、jQueryは選択された各ドロップダウンの値をループし、ajax呼び出しを行います。最後の値を除いて正常に動作します。リストの最後の値は決してajaxコールには出てこないようで、1つの項目だけが選択されていれば、何もしないようです。どんな助けでも大歓迎です。ここでJQuery .each()最後の値を切り捨てるループ

は私のコードです:

$("#add_members").click(function() { 
    var members = $("#project_members").val(); 

    jQuery.each(members, function() { 
     var projectid = <? php echo $project_id; ?> ; 
     var member = this[0]; 

     $.post([url], { 
      project_id: projectid, 
      user_id: member 
     }, function (data) { 
      alert(data); 
     }); 
    }); 

    location.reload(); 
}); 
+1

'location.reload() 'のためにデータがポストされていない可能性が高くなります。ドキュメントがアンロードされると、すべての(AJAX)リクエストがキャンセルされます。 –

答えて

1

私は他のレースコンディションと競合する可能性が最も高いことに同意します。あなたのlocation.reloadはあなたが最後に投稿した直後に呼び出され、おそらくあなたのajaxを取り消します。

これはあなたの競合状態を終了する必要が$ .ajaxSetup

jQuery.ajaxSetup({async: false}); //set to false for this method 

    $.post([url], { 
     project_id: projectid, 
      user_id: member 
     }, function (data) { 
      alert(data); 
    }); 

    jQuery.ajaxSetup({async: true}); //Change it back when done if you so desire 

を使用して、非同期にならないためにあなたのAJAXを設定してみてください。

+0

ありがとうございます。私はこれを試して、それは私の問題を解決しました。 –

2

短い答え:あなたはレースの状況を持っています。

長めの回答:.eachは同期ですが、つまり、各コマンドで繰り返される要素のすべてがlocation.reload()の呼び出しの前に実行されるためです。しかし.postは非同期です。つまり、各ループから抜け出す前にすべての投稿が返ってきたことを保証することはできません!ここで

+0

これを説明していただきありがとうございます。 –

2

は$ .eachでの作業の簡単な例であると選択します。http://jsfiddle.net/7fhee/

問題はあなたがlocation.reload(呼び出す前に、あなたのAJAX呼び出しが終了するのを期待している可能性が最も高い)、おそらくされていません事件に行く。この問題を解決するには、ajax呼び出しの成功コールバックでlocation.reload()を実行する必要があります。

+0

この例をありがとう。 –

関連する問題