在使用此代码之前,请注意图像的 onload 事件存在几个跨浏览器问题。它们在 jQuery.load
方法的文档中进行了描述。
您需要构建一个 Deferred 对象并根据每个图像的 onload 函数对其进行管道传输。
$.when.apply($,$.map(hrefs, function(href) {
var imgLoad = $.Deferred(),
$img = $('<img>').css('height',windowHeight);
ul.append($('<li>').append($img));
$img.load($.proxy(imgLoad.resolve,imgLoad));
$img.attr('src',href);
return imgLoad;
})).done(function(){
// all images are loaded when this executes
})
此代码用于jQuery.map
将 href 数组转换为 Deferred 对象数组。在循环和附加图像时,每个图像都有自己的 Deferred 对象,其.resolve
方法绑定到.load
图像上的处理程序。当图像加载时,Deferred 将解析。
这个 Deferreds 数组作为参数应用到jQuery.when
,它返回一个 Promise,当它的所有参数都解析时解析——在这种情况下,这意味着所有图像都已加载!然后我们将.done
回调附加到该 Promise。