2012-01-14 10 views
8

Z Javascriptem, mam funkcję, która tworzy element audio z createElement("audio") i zaczynam grać w pętli bez używania appendChild(), tzn. Bez dołączania jej do DOM. Element tworzony jest przechowywany w zmiennej, niech nazywa go music1:Jak poprawnie usunąć dźwięk HTML5 bez dołączania do DOM?

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

Co chciałbym zrobić, to zmienić muzyka grana, jeśli to możliwe, stosując tę ​​samą funkcję i przechowywania elementu w taki sam zmienna.

Co zrobić, jest to, że przed powyższym kodzie:

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

Ale: jeśli usunąć music.pause() pierwsza muzyka wciąż gra, a druga zaczyna grać zbyt w tym samym czasie, co sprawia, że ​​myślę, że pierwsza muzyka jest zawsze gdzieś w dokumencie/w pamięci. Również, music = null wydaje się bezużyteczna. Nie chcę używać jQuery.

Czy masz jakiś pomysł, aby prawidłowo usunąć pierwszą muzykę, usunąć element itp.?

Właściwie, komentarz kennis ma rację, próbowałem po prostu zmienić atrybut src i nie modyfikować zmiennej "music" (ani ustawić jej na wartość null, ani ponownie tworzyć elementu) i wydaje się, że działa. Tak więc, dla przypomnienia: Dla każdego źródła zmieniającym tutaj jest funkcja:

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); 
+1

Już odpowiedziałeś na swoje pytanie! 'music.pause()' przed usunięciem obiektu. –

+3

Czy jest jakiś powód, dla którego nie chcesz po prostu zmieniać atrybutu "src", kiedy jesteś gotowy, aby rozpocząć nową piosenkę? –

+0

@kennis Właściwie, 'music.setAttribute (" src ", music_Source);' jest wywoływane ponownie z nowym music_Source dla drugiej muzyki, więc domyślam się, że o to ci chodzi, zmieniam atrybut src. @Francis Avila Ale nie jestem przekonany, czy muzyka.pause() przed usunięciem pozwala "usunąć" poprzednią muzykę we właściwy sposób. A może brakuje mi czegoś lub nie wyjaśniam się wystarczająco dobrze :) –

Odpowiedz

8

zamiast usunąć, tym lepszy sposób to zrobić byłoby zmienić src

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

tamtędy jesteś zawsze radzimy sobie z tym samym obiektem, więc rzadziej trafiasz na DOM, a także unikasz problemu posiadania dwóch graczy w tym samym czasie:

Upewnij się również, że użyłeś metody .load do załadowania nowego dźwięku, w przeciwnym razie dalej graj w starego.

+2

Właściwie wygląda na to, że działa bez obciążenia(), poprzednia muzyka zatrzymuje się i zaczyna grać nowa. Wygląda na to, że muzyka zaczyna się ładować po zmianie źródła (w Chrome przynajmniej, ponieważ pracuję nad aplikacją specyficzną dla webkitów). Ale zmiana źródła jest rzeczywiście rozwiązaniem. –

2

Oryginalny obiekt zostanie usunięty, ale tylko wtedy, gdy moduł czyszczenia pamięci określi, że nadszedł czas. Fakt, że jest to audio, może komplikować pewne rzeczy i utrudniać przeglądarce określenie tego.

Tak, tak, po prostu użyj ponownie oryginalnego obiektu.

Powiązane problemy