IE 6-9、Chrome 19、および Firefox 3.6-10、Opera 10.10-11.52、Android 4、および iOS 5 でテストおよび動作するsを使用する比較的防弾の方法( demo ) を次に示します。Deferred
Deferred
最初に、jQuery コレクション内の各要素の の配列を返す小さな jQuery プラグインを作成します。要素が読み込まれると、それぞれDeferred
が解決されます。要素の読み込みに失敗した場合、または (オプションで) 数timeout
秒以上かかる場合は拒否されます。
$.fn.loaded = function(opts) {
var o = $.extend({timeout:10000}, opts) // Merge default options with supplied options
, r = []; // Return value
this.each(function() {
var dfd = new $.Deferred(), el = $(this), to;
if (o.timeout) to = setTimeout(function() {
done();
dfd.reject();
}, o.timeout);
el.bind('load.dfdl', function() {
done();
dfd.resolve();
}).bind('error.dfdl', function() {
done();
dfd.reject();
});
function done() { // internal clean-up
clearTimeout(to);
el.unbind('.dfdl');
}
r.push(dfd.promise());
});
return r;
};
タイムアウトは、ブラウザが実際にイベントを発生させないケースを防ぎます。ここではデフォルトのタイムアウトを 10 秒に設定しました。現実の世界では、それを減らしたいと思うかもしれません。
ここで、例の画像として使用するランダムなサイズのプレース子猫を 10 個生成します。
var imgs=[];
for (var i = 0; i < 10; i++) imgs.push('<img src="http://placekitten.com/' + rnd() + '/' + rnd() + '"> ');
$('#imgs').html(imgs.join());
最後に、いくつかの魔法を使ってすべてをまとめます。
$.when.apply($, $('#imgs img').loaded({timeout:10000}) ).done(function() {
alert('loaded successfully');
}).fail(function() {
alert('load failed or timed out');
});
$.when
Deferred
すべての子が解決されたときにのみ解決されるDeferred
か、子が拒否されたときに拒否されるマスターを作成します。通常、それぞれを引数として渡す必要があるため ( s のDeferred
配列を渡すことはサポートされていません)、配列を指定する必要があります。(あなたのアプリコードがよりきれいになるようにするかもしれません)Deferred
apply
$.whenall = function(dfds) { $.when.apply($,dfds); };
$.whenall( $('#imgs img').loaded() )...