從Udacity:
var gCachedAssets = {};
function loadAssets(assetList, callbackFcn) {
// All the information we need to keep track of
// for this batch.
var loadBatch = {
count: 0,
total: assetList.length,
cb: callbackFcn
};
for(var i = 0; i < assetList.length; i++) {
if(gCachedAssets[assetList[i]] === null) {
var assetType = getAssetTypeFromExtension(assetList[i]);
if(assetType === 0) { // Asset is an image
var img = new Image();
img.onload = function() {
onLoadedCallback(img, loadBatch);
};
img.src = assetList[i];
gCachedAssets[assetList[i]] = img;
} else if(assetType === 1) { // Asset is Javascript
var fileref = document.createElement('script');
fileref.setAttribute("type", "text/javascript");
fileref.onload = function (e){
onLoadedCallback(fileref,loadBatch);
};
fileref.setAttribute("src", filename);
document.getElementsByTagName("head")[0].appendChild(fileref);
gCachedAssets[assetList[i]] = fileref;
}
} else { // Asset is already loaded
onLoadedCallback(gCachedAssets[assetList[i]], loadBatch);
}
}
}
function onLoadedCallback(asset, batch) {
// If the entire batch has been loaded,
// call the callback.
batch.count++;
if(batch.count == batch.total) {
batch.cb(asset);
}
}
function getAssetTypeFromExtension(fname) {
if(fname.indexOf('.jpg') != -1 || fname.indexOf('.jpeg') != -1 || fname.indexOf('.png') != -1 || fname.indexOf('.gif') != -1 || fname.indexOf('.wp') != -1) {
// It's an image!
return 0;
}
if(fname.indexOf('.js') != -1 || fname.indexOf('.json') != -1) {
// It's javascript!
return 1;
}
// Uh Oh
return -1;
}
要使用它,提供了資產的文件名作爲字符串數組loadAssets
。當所有資產都被加載時觸發callbackFcn
,而每次加載單個資產時調用onLoadedCallback
。
因爲,對於Javascript的安全性限制,您無法獲得要加載的字節數加載v/s字節數,您可以使用加載的資產數v/s加載的資產數batch
對象(batch.count/batch.total
)。
你可以寫一個加載器的JavaScript加載其他腳本,圖像和樣式表。其中每個都有一個「負載」事件,您可以在其中進行回調。 – Abhinav
我知道。但問題是我應該如何編寫加載器JavaScript。 –
不需要重新發明輪子:http://thinkpixellab.com/pxloader/ – Federico