您在代码中有几个问题。
首先,checkComplete()
函数编写不正确。应该是这样的:
var checkComplete = function() {
var imgs = $('img');
if(imgs.filter(function() {return this.complete;}).length == imgs.length) {
$('.status').text('Loaded');
} else {
$('.status').text('Loading...');
}
};
这里的主要修复是过滤器回调需要引用this.complete
,而不是$('img').prop('complete')
因为您试图一次过滤单个项目。
其次,您在更改值后依赖两者.complete
并.load
正常工作。.src
这显然是它们不能在所有浏览器中正常工作的情况之一。
解决此问题的防弹方法是为新图像创建一个新图像对象,在设置值之前设置 onload 处理程序.src
,当两个 onload 处理程序都被触发时,您将知道两个新图像都已加载,您可以替换一旦你在 DOM 中有了新的。
这是一个适用于 FF 的版本:
$(document).ready(function() {
$('#button').click(function() {
var imgA = new Image();
var imgB = new Image();
imgA.className = "a";
imgB.className = "b";
var loaded = 0;
imgA.onload = imgB.onload = function() {
++loaded;
if (loaded == 2) {
$("img.a").replaceWith(imgA);
$("img.b").replaceWith(imgB);
$('.status').text('Loaded');
}
}
// the part with adding now to the end of the URL here is just for testing purposes to break the cache
// remove that part for deployment
var now = new Date().getTime();
imgA.src = 'http://farm9.staticflickr.com/8545/8675107979_ee12611e6e_o.jpg?' + now;
imgB.src = 'http://farm9.staticflickr.com/8382/8677371836_651f586c99_o.jpg?' + now;
$('.status').text('Loading...');
});
});
工作演示:http: //jsfiddle.net/jfriend00/yy7GX/
如果要保留原始对象,可以仅将新创建的对象用于预加载新图像,然后在预加载后更改 .src,如下所示:
$(document).ready(function() {
$('#button').click(function() {
var imgA = new Image();
var imgB = new Image();
var loaded = 0;
imgA.onload = imgB.onload = function() {
++loaded;
if (loaded == 2) {
$("img.a")[0].src = imgA.src;
$("img.b")[0].src = imgB.src;
$('.status').text('Loaded');
}
}
// the part with adding now to the end of the URL here is just for testing purposes to break the cache
// remove that part for deployment
var now = new Date().getTime();
imgA.src = 'http://farm9.staticflickr.com/8545/8675107979_ee12611e6e_o.jpg?' + now;
imgB.src = 'http://farm9.staticflickr.com/8382/8677371836_651f586c99_o.jpg?' + now;
$('.status').text('Loading...');
});
});
此版本的工作演示:http: //jsfiddle.net/jfriend00/ChSQ5/