我试图使用SoundJS动态加载声音。
如果我注册了已经注册createjs.Sound.registerSound
的声音,我就不会加载回调函数(由" fileload"事件监听器调用)。
createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, this));
createjs.Sound.registerSound(url, "song");
根据帖子here和SoundJS documentation,我可以检查声音是否已加载loadComplete(url)
。
但是这个:
createjs.Sound.loadComplete("audio/file.mp3")
...返回:
Uncaught TypeError: Cannot read property 'mp3' of null
。
问题似乎是以下函数返回null,因为activePlugin
为null。为什么在音频正常播放时会发生这种情况(我在Mac上的Chrome上进行测试)?不应该使用默认的WebAudioPlugin或HTMLAudioPlugin吗?
s.getCapabilities = function () {
if (s.activePlugin == null) {
return null;
}
return s.activePlugin._capabilities;
};
更新
这是一个临时的解决方法,很难看,但很有效。
我解决了两件事:
1)在使用createjs.Sound.loadComplete(url)之前,我首先检查createjs.Sound.activePlugin是否为真。
2)为了处理尚未加载的音频文件,我在
SoundJS.loadComplete()
函数中添加了一个条件来检查是否s._preloadHash[src] === undefined
,如果是,则返回false(这意味着那个URL)没有注册的网址会返回false,就像文件没有被加载一样):
s.loadComplete = function (src) {
var details = s._parsePath(src);
if (details) {
src = s._getSrcById(details.src).src;
} else {
src = s._getSrcById(src).src;
}
// song has not been registered. return false
if (s._preloadHash[src] === undefined)
return false;
return (s._preloadHash[src][0] == true); // src only loads once, so if it's true for the first it's true for all
};
...在另一个JavaScript文件中:
loadSong: function(url){
currentSongURL = url;
// if Sound.activePlugin returns false, load the song.
if (!createjs.Sound.activePlugin){
createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, this));
createjs.Sound.registerSound(url, url); // url, id
return;
}
// if song is already loaded, resolve deferred.
if(createjs.Sound.loadComplete(url)) {
songDeferred.resolve();
}else{
createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, this));
createjs.Sound.registerSound(url, url); // url, id
}
},
我正在研究如何在不弄乱SoundJS类的情况下扩展SoundJS.loadComplete()
,以及如何避免上面loadSong()
函数上重复的代码。它确实看起来非常混乱,但这就是我现在所拥有的,使它按照我打算的方式工作。任何有关这方面的帮助都将深受赞赏。