在我启动基于JS的应用程序之前,我正在预加载所有资源:
assets = [....]; // files
$.each(assets,function(){
var r = /\.([^\.]+)$/;
var ext = r.exec(this); //get file type
if (ext[1] == 'png'){
var tmp = new Image();
} else if (ext[1] == 'mp3'){
var tmp = new Audio();
}
tmp.src = this;
tmp.onload = function(){
var i = assets.indexOf(this);
assets.splice(i,1);
if (!assets.length){
console.log('all loaded');
app.build();
}
}
});
当我在我的数组中只有png
时,这很好用,但是当我添加音频(mp3)时,DOM元素被创建,但它永远不会触发onload
,所以应用程序永远不会启动。我已经尝试添加tmp.load()
,但它没有任何区别 - 我也无法在网上找到任何全面的信息。这种方法甚至可能吗? Audio()
甚至会发射适当的事件吗?谢谢!
答案 0 :(得分:2)
您正在寻找media events,其中说明您可以使用例如loadeddata
。
我想谈谈其他一些观点:
我改变了你的代码:
$.each(assets, function() {
var r = /\.([^.]+)$/,
ext = r.exec(this), //get file type
tmp = ext[1] === 'png'
? $("<img>")
: $("<audio>"),
eventName = ext[1] === 'png'
? 'load'
: 'loadeddata';
tmp
.on(eventName, function() {
var i = assets.indexOf(this);
assets.splice(i, 1);
if (!assets.length){
console.log('all loaded');
app.build();
}
})
.attr("src", this); // only set after adding the load callback
// to avoid a possible race condition
});