我正在尝试编写一个使用 [SoundManager 2][1] API 的 JavaScript 应用程序,旨在运行所有桌面和移动浏览器。在iPad平台上,Soundmanager正在使用HTML5音频api,因为有flash支持。现在,当我尝试背靠背播放两个音频文件时,这两个文件都是为了响应单击事件而加载的,偶尔会引发 [HTML5::stalled][2] 事件。如何设置事件处理程序以捕获停止的事件?
由于我的应用程序中的声音对象是动态创建的,并且我不知道如何直接访问由 SoundManager 创建的标签,因此我尝试使用委托来处理停止的事件:
document.delegate('audio', 'stalled', function (event) {...});
它不起作用。 该事件没有因停滞而提出。(我的处理程序中有一个警报)。
还尝试使用 [Sound::onsuspend()][3] 来侦听停滞,但 onsuspend 弹出在声音的末尾::p lay()。 我们如何区分停滞和其他可能引发音频::暂停的事件? 有没有其他方法可以访问SoundManager必须创建的标签才能播放HTML音频?
我用以下解决方案解决了它。这没有被记录下来,也没有通过逆向工程发现。这一切都是关于访问 html 音频对象,该对象可在 _a 下使用。
currentSound = soundManager.createSound({..});
currentSound._a.addEventListener('stalled', function() {
if (!self.currentSound) return;
var audio = this;
audio.load();
audio.play();
});
该方法的主体基于这篇关于 html5 在 safari 中停滞回调的文章
我可以建议一个不同的"修复",我使用html5的平台(三星智能电视):
var mySound = soundManager.createSound({..});
mySound.load();
setTimeout(function() {
if (mySound.readyState == 1) {
// this object is probably stalled
}
}, 1500);
这是有效的,因为在html5中,与flash不同,"readystate"属性几乎立即从"0"跳到"3",跳过"1"。(因为如果曲目开始缓冲,它就可以播放......
希望这对你也有用。