Как правильно удалить html5 аудио без добавления в DOM? - PullRequest
8 голосов
/ 14 января 2012

В Javascript у меня есть функция, которая создает аудиоэлемент с createElement("audio"), и начинаю воспроизведение в цикле без использования appendChild(), я имею в виду, не добавляя его в DOM.Созданный элемент хранится в переменной, назовем его music1:

music = document.createElement("audio");
 music.addEventListener("loadeddata", function() {
 music.play();
});
music.setAttribute("src", music_Source);

Что я хотел бы сделать, это изменить воспроизводимую музыку, если это возможно, используя ту же функцию, и сохранить элементв той же переменной.

Что я делаю, это перед кодом выше:

if(typeof(music) == "object") {
 music.pause();
 music = null;
}

Но: если я удаляю music.pause(), первая музыка продолжает играть, а вторая начинает игратьв то же время, что заставляет меня думать, что первая музыка всегда где-то в документе / в памяти.Кроме того, music = null кажется бесполезным.Я не хочу использовать jQuery.

У вас есть идея, как правильно удалить первую музыку, удалить элемент и т. Д.?

На самом деле, комментарий Кенниса верен, япопытался просто изменить атрибут src и не изменять переменную «music» (не устанавливая для него значение null и не воссоздавать элемент), и, похоже, это тоже работает.Итак, для записи: Для каждого источника, меняющегося здесь, есть функция:

if(typeof(music) != "object") {
  //audio element does not exist yet:
  music = document.createElement("audio");
  music.addEventListener("loadeddata", function() {
    music.play();
  });
}
music.setAttribute("src", music_Source);

Ответы [ 2 ]

10 голосов
/ 15 января 2012

вместо удаления, лучший способ сделать это - изменить src

music.setAttribute('src',theNewSource); //change the source
music.load(); //load the new source
music.play(); //play

таким образом, вы всегда имеете дело с одним и тем же объектом, так что вы реже бьете по DOM, а также избегаете проблемы с двумя игроками одновременно

Также убедитесь, что вы используете метод .load для загрузки нового аудио, иначе оно продолжит воспроизводить старое.

2 голосов
/ 15 января 2012

Исходный объект будет удален, но только тогда, когда сборщик мусора определит, что пора. Тот факт, что он audio, может усложнить ситуацию и затруднить принятие этого решения браузером.

Итак, да, просто используйте вместо этого оригинальный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...