3

我只想在 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迭代图像的函数,为每个图像创建一个新的延迟对象。问题是,如果我返回一个这些数组作为参数,它就不起作用(因为它不是一个延迟对象,它是一个延迟对象数组)。

我也摆弄$.Deferred.pipe了一下(尝试创建一个链接的延迟对象传递给when),但这似乎没有帮助。

有没有明智的方法来做到这一点?

4

2 回答 2

6

有一种方法可以将延迟对象数组传递给$.when

$.when.apply($, myArray).done(...);
于 2011-06-22T12:00:27.097 回答
3
var imgDefs = $("img").map(function(key, val) {
  var def = $.Deferred();
  $(val).load(def.resolve);
  return def;
}).toArray();

$.when.apply($, imgDefs).done(...);
于 2011-06-22T12:07:34.587 回答