我只想在加载jQuery对象中的所有图像时执行一些代码。我可以这样做:
var img1Load = $.Deferred();
$('#img1').load(img1Load.resolve);
var img2Load = $.Deferred();
$('#img2').load(img2Load.resolve);
$.when(img1Load, img2Load).done(function(){
console.log('both imgs loaded');
});
这没关系,但我不想为每个图像定义一个单独的延迟对象。如果有数百个或者某个页面上是否有或不存在该怎么办?我想一下子做这件事,比如:
$.when(allImagesHaveLoaded).done(function(){
console.log('all imgs loaded');
});
我尝试创建一个allImagesHaveLoaded
函数,迭代图像,为每个图像创建一个新的延迟对象。麻烦的是,如果我返回一个这样的数组用作when的参数,它就不起作用(因为它不是延迟对象,它是一个延迟对象的数组)。
我也尝试了$.Deferred.pipe
(尝试创建一个链接的延迟对象以传递给when
),但这似乎没有帮助。
有没有合理的方法呢?
答案 0 :(得分:6)
有一种方法可以将延迟对象数组传递给$.when
:
$.when.apply($, myArray).done(...);
答案 1 :(得分:3)
var imgDefs = $("img").map(function(key, val) {
var def = $.Deferred();
$(val).load(def.resolve);
return def;
}).toArray();
$.when.apply($, imgDefs).done(...);