ajaxって便利ですよね。
非同期でコンテンツを追加読み込みする際は必須の手法です。
あまりない状況かと思いますが、今回ajaxで読み込んだコンテンツの高さを取得する必要がありました。
しかもajaxの実行はループ内(each関数)で数回行うという合わせ技です。
処理の順序としては、
(1)ajaxでコンテンツ読み込み。を数回繰り返し。
(2)読み込んだ各コンテンツの高さ取得。をまた数回繰り返し。
です。繰り返しの繰り返しです。
が、この処理の実行順序がなんとも不安定。
かつ、(2)の処理が(1)の実行途中で先走っている始末。
ダメダメの繰り返しじゃんってことで調べました。
ajaxCompleteで解決!と思いきや
ajaxCompleteを使えば、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完了時に実行されており、高さもバッチリ取得されていました。
しかしこのajaxComplete君、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(); }); });
バッチリやん!