预加载音频文件/事件?

时间:2012-02-17 16:43:47

标签: javascript jquery events audio html5-audio

在我启动基于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()甚至会发射适当的事件吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您正在寻找media events,其中说明您可以使用例如loadeddata

我想谈谈其他一些观点:

  • 正则表达式字符组中的字符不需要转义。
  • 为什么不使用jQuery创建元素并绑定事件处理程序?

我改变了你的代码:

$.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
});