1

我有一个通过 JavaScript 使用音频的 HTML5 网页。我有一个基本版本,可以加载正确的音频文件(例如,ogg vs mp3 等),然后正确播放该文件中的精灵。这个基本版本只有 1 个 javascript 文件,它适用于我尝试过的所有操作系统/浏览器组合,包括:OSX (Safari, Chrome, Firefox), iOS 5 and 6 (Safari), Windows 7 (Firefox, Chrome),和安卓 4.2 (火狐)。

我现在将代码插入到生产版本中。现在,HTML 页面加载了许多其他 JavaScript 文件(例如,jquery、jquery ui、flot)。但是,所有音频代码都在一个文件中,该文件通过

<script src="/foo/bar/sound.js"></script>. 

在这两种情况下,sound.js 中的代码都是由用户单击按钮调用的。在上述所有平台/浏览器组合上,组合代码在 iOS 上除外(在 iPad2 和 iPad3 上的 iOS 5 和 6 上测试)。我得到的错误是

INVALID_STATE_ERR: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.

这发生在尝试根据所需的特定精灵设置 mySound.currentTime 的行上:

mySound.currentTime = spriteData[currentSound].start;

mySound 是我的声音对象,并且 spriteData 是正确的。奇怪的是,在真实 iPad 上失败的相同代码在 iOSSimulator 中运行良好,无论我模拟 iOS 5 还是 iOS 6。

我该如何调试这种情况?我不知道在哪里寻找和尝试什么。任何建议,将不胜感激。

4

2 回答 2

0

Mobile Safari 有一个开发者模式,允许您从 Mac 上的 Safari 进行附加;请参阅Safari Web 内容指南:在 iOS 上调试 Web 内容

我也会尝试分解表达式以查看导致错误的位,例如

var t = spriteData[currentSound].start;
mySound.currentTime = t;
于 2013-01-27T22:06:31.853 回答
0

我终于找到了解决方案。在所有平台上,以下代码都适用于独立代码,但与生产页面的其余部分结合使用时,在 iOS(甚至是 iOS 6.1)上会失败:

audioSprite = document.createElement('audio');
audioSprite.setAttribute("src","/foo/bar/file.xxx");

其中 xxx 是 mp4、ogg、wav 或 mp3,具体取决于浏览器可以处理的内容。

将这两行更改为 - 并保持其他所有内容相同 - 在生产页面上的 iOS 上进行以下工作:

audioSprite = new Audio('http://example.com/foo/bar/file.xxx');

我仍然不知道为什么第二个版本有效而​​第一个版本无效。

于 2013-01-31T17:29:26.550 回答