質問にはHTMLが含まれていないため、動的コンテンツをロードする別の(で識別される)<div id="pageData">
を保持するコンテナーがあると想定しています。<div>
divname
まず、オブジェクトで$(..).ready()
のみ使用できるdocument
ため、オブジェクトに適用すると、<div>
jQueryのドキュメントに反します。
私があなたの目標を達成するために考えることができる最善の方法は、AJAXを介して動的にロードしたHTML内の画像を追跡し、すべてがロードされるまでそれらを監視することです。次に、コンテナの高さを設定するためのロジックを適用できます<div>
。
問題は、load
すでにロードされている画像にイベントハンドラーを適用すると、起動しないことです。画像がすでに読み込まれているかどうかを判断するのは難しい場合がありますが、受け取った知識は、complete
プロパティ(存在する場合)を確認するか、画像の高さが0より大きいかどうかを確認することです。
function imageLoaded(img) {
if(typeof img.complete != 'undefined') {
return img.complete;
}
else {
return(img.height > 0);
}
}
これで、次の手順を実行できます。
- AJAXコンテンツを含む
<div>
(例)をフェードアウトします#pageContent
- AJAXコンテンツをロードする
- 新しいコンテンツですべての画像を検索し、画像の数を数え、
load
各画像にイベントハンドラーを追加してから、各画像が既に読み込まれているかどうかを確認し、読み込まれている場合は手動でload
イベントを発生させます。
- loadイベントでは、カウンターをデクリメントします。カウンターがゼロに達したら、コンテナーの高さを計算
<div>
し、コンテンツをフェードインします
たとえば(動作するjsfiddleについてはここを参照してください):
$pageData = $('#pageData');
$pageContent = $('#pageContent');
$pageData.height($pageData.height());
$pageContent.fadeOut(function() {
$pageContent.load('http://your.dynamic.content', contentLoaded);
});
function contentLoaded() {
var $loadables = $(this).find('img');
var loadableCount = $loadables.length;
// Attach onLoad event handlers to each image
$loadables.load(function() {
loadableCount--;
checkAllLoaded(loadableCount);
});
// Trigger the onLoad events manually for any images that have already loaded
$loadables.each(function() {
if(imageLoaded(this)) {
$(this).trigger('load');
}
});
}
function checkAllLoaded(loadCount) {
if (loadCount <= 0) {
$('#pageData').animate({
height: $('#pageContent').height()
}, 600, function() {
$('#pageContent').fadeIn();
});
}
}