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画像を反復処理し、それぞれに新しい遅延オブジェクトを作成する関数を作成しようとしました。問題は、これらの配列を when のパラメーターとして使用するために返すと、機能しないことです (これは遅延オブジェクトではなく、遅延オブジェクトの配列であるためです)。

$.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 に答える