如果你想這樣做,與Deferreds /許諾,那麼,你可以這樣做如下:
$(function() {
function loadRow($imgs, timeout) {
var dfrd = $.Deferred(),
n = 0;
$imgs.each(function() {
this.onload = function() {
if(++n == $imgs.length) { dfrd.resolve(); }
}
this.src = "/path/to/img";
});
setTimeout(dfrd.resolve, timeout);//in case of slow network or img.onload failure
return dfrd.promise();
}
var $images = $(img.whatever),//adjust as required
rowlength = 5,//adjust as required
rowFilter = function(i) {
return function(index) {
return (index > i * rowlength) && (index < (i+1) * rowlength);
}
},
nRows = Math.ceil($images.length/rowlength);
timeout = 10000,//(ms) adjust as required
d = $.Deferred().resolve();
for(var i=0; i<nRows; i++) {
var $imgs = $images.filter(rowFilter(i));
d = d.then(loadRow($imgs, timeout));
}
});
未經檢驗
loadRow()
負載一行,並返回一個該行在加載或超時時已解決的Promise。
的代碼的其餘部分:
- 建立用於圖像的裝置,以由行索引來選擇。
- 建立了一個種子Deferred,它立即解析以允許加載過程開始。
- 建立了幾個其他的變量。
- 循環遍歷行建立一個
.then()
鏈,它隨着它的進展調用loadRow()
。
.then()
鏈是控制行加載順序的機制。
該代碼比其他答案中的代碼體積更大,但它對於您來說也稍微多一點,因爲它包含超時機制。如果您有更簡潔的方法選擇每一行中的圖像,它將會簡化。
爲什麼你同時設置img.src和background-image? – Tommi