通过Javascript动态嵌入声音对象

时间:2009-05-26 06:05:59

标签: javascript ajax audio embed

我需要使用AJAX为HTML页面加载一些WAV文件。我使用AJAX来获取WAV文件的详细信息,然后使用embed标签,我可以确认文件已成功加载,因为当我将自动启动设置为true时,文件会播放。但是,我只需要在用户单击按钮(或触发事件)时才能播放文件。以下是我预加载这些文件的代码:

function preloadMedia() {
  for(var i = 0; i < testQuestions.length; i++)  {
  var soundEmbed = document.createElement("embed");
  soundEmbed.setAttribute("src", "/media/sounds/" + testQuestions[i].mediaFile);
  soundEmbed.setAttribute("hidden", true);
  soundEmbed.setAttribute("id", testQuestions[i].id);
  soundEmbed.setAttribute("autostart", false);
  soundEmbed.setAttribute("width", 0);
  soundEmbed.setAttribute("height", 0);
  soundEmbed.setAttribute("enablejavascript", true);
  document.body.appendChild((soundEmbed));
}

}

我使用以下代码播放文件(基于用户想要播放的声音文件)

function soundPlay(which) {
  var sounder = document.getElementById(which);
  sounder.Play();
}

这里出了点问题,因为我测试过的浏览器都没有使用上面的代码播放文件。没有错误,代码只返回。

我会离开它(也​​就是说 - 我会说服客户将所有WAV转换成MP3并使用MooTools)。但我意识到我可以播放声音文件,它们不是动态嵌入的

因此,相同的soundPlay函数适用于以下列方式嵌入的文件:

<embed src="/media/sounds/hug_sw1.wav" id="sound2" width="0" heigh="0" autostart="false" enablejavascript="true"/>

HTML中的任何地方。

它在所有浏览器中都能很好地运行。

任何人都有这方面的线索?这在所有浏览器中都是某种未记录的安全限制吗? (请记住,文件会动态预加载,因为我可以通过将autostart属性设置为true来确认 - 它们都会播放)。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:1)

嗯...也许,你需要等待让embed对象在调用preloadMedia()之后加载它的“src”?

您是否确定在调用soundPlay()时加载了媒体文件?

答案 1 :(得分:0)

我知道你的问题到现在有点老了,但万一你仍然想知道......

soundEmbed.setAttribute("id", testQuestions[i].id);

您使用了相同的id两次,但getElementById只返回一个元素,如果找不到一个匹配元素,则false

你可以尝试这样的事情:

soundEmbed.setAttribute("id", "soundEmbed_"+testQuestions[i].id);

始终牢记id必须是唯一的

答案 2 :(得分:0)

提供更多兼容性的提示: 我读here宽度和高度需要&gt; 0适用于MacOS上的Firefox。