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();
});
});
バッチリやん!


