Воспроизведение динамически встроенного звукового объекта через Javascript - PullRequest
6 голосов
/ 26 мая 2009

Мне нужно в фоновом режиме загрузить некоторые WAV-файлы для HTML-страницы, используя AJAX. Я использую AJAX, чтобы получить подробную информацию о файлах WAV, затем использую тег embed, и я могу подтвердить, что файлы были успешно загружены, потому что, когда я устанавливаю autostart в 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 ]

1 голос
/ 26 мая 2009

Хм .. возможно, вам нужно дождаться , пока встраиваемый объект загрузит свой "src" после вызова preloadMedia ()?

Вы уверены, что медиа-файл загружается при вызове soundPlay ()?

0 голосов
/ 16 мая 2012

Просто совет для большей совместимости: Я прочитал здесь , что ширина и высота должны быть> 0 для Firefox на MacOS.

0 голосов
/ 04 марта 2010

я знаю, что ваш вопрос уже немного устарел, но если вам все еще интересно ...

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

вы использовали один и тот же id дважды, но getElementById возвращает только один элемент или false, если он не находит точно один соответствующий элемент.

Вы можете попробовать что-то вроде этого:

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

всегда помните, что id должен быть уникальным

...