ajaxって便利ですよね。
非同期でコンテンツを追加読み込みする際は必須の手法です。

あまりない状況かと思いますが、今回ajaxで読み込んだコンテンツの高さを取得する必要がありました。
しかもajaxの実行はループ内(each関数)で数回行うという合わせ技です。

処理の順序としては、
(1)ajaxでコンテンツ読み込み。を数回繰り返し。
(2)読み込んだ各コンテンツの高さ取得。をまた数回繰り返し。
です。繰り返しの繰り返しです。

が、この処理の実行順序がなんとも不安定。
かつ、(2)の処理が(1)の実行途中で先走っている始末。

ダメダメの繰り返しじゃんってことで調べました。

ajaxCompletedeで解決!と思いきや

ajaxCompletedeを使えば、ajax処理が完了した時点で着火します。
用途はこんな感じです。

	$(document).ready(function(){
	    //コンテンツ読み込み
	    $(".container").each(function(index){
	    	var obj = $(this);
			$.ajax({
				url: 'sample'+index+'.html',
				dataType: 'html',
				success: function(data) {
					$(obj).append(data);
				}
			});
	    });
	});

	$(document).ajaxComplete(function() {
	    //コンテンツ高さ取得
		$(".container").each(function(index){
			item_obj[index] = $(this).outerHeight();
		});
	});

これでちゃんとajax完了時に実行されており、高さもバッチリ取得されていました。

しかしこのajaxCompletede君、ajax処理が1回完了する度に走り出してしまいます。
ですので、今回のような繰り返し処理の場合、(2)の処理がajaxの数だけ繰り返されます。
またもや繰り返しの繰り返しです。

ajaxStopで解決!

名前だけみると、止めちゃうの?って不安になりますが、止めません。
ページ内のajaxがすべて完了した時に実行するスグレモノです。

そしてこのように改善。

	$(document).ready(function(){
	    //コンテンツ読み込み
	    $(".container").each(function(index){
	    	var obj = $(this);
			$.ajax({
				url: 'sample'+index+'.html',
				dataType: 'html',
				success: function(data) {
					$(obj).append(data);
				}
			});
	    });
	});

	$(document).ajaxStop(function() {
	    //コンテンツ高さ取得
		$(".container").each(function(index){
			item_obj[index] = $(this).outerHeight();
		});
	});

バッチリやん!