由于问题中没有包含任何 HTML,我假设您的容器<div id="pageData">
包含另一个<div>
(由 标识divname
),您正在将动态内容加载到该容器中。
首先,$(..).ready()
只能在document
对象上使用,因此将其应用于 a<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
事件。
- 在加载事件中,我们递减计数器。当计数器达到零时,然后计算容器的高度
<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();
});
}
}