2012-01-14 11 views
8

जावास्क्रिप्ट के साथ, मेरे पास एक ऐसा फ़ंक्शन है जो createElement("audio") के साथ एक ऑडियो तत्व बनाता है, और appendChild() का उपयोग किए बिना लूप में खेलना शुरू करता है, मेरा मतलब है कि इसे DOM में शामिल किए बिना। तत्व बनाया एक चर में रखा जाता है, यह कहा जाता है music1 करते हैं:मैं डोम को जोड़ने के बिना ठीक से एचटीएमएल 5 ऑडियो कैसे हटा सकता हूं?

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 का उपयोग नहीं करना चाहता।

क्या आपके पास पहले संगीत को सही ढंग से हटाने, तत्व को हटाने, या इसी तरह से कोई विचार है?

असल में, केनिस की टिप्पणी सही है, मैंने केवल "स्रोत" चर को संशोधित करने की कोशिश की है, न कि इसे "संगीत" चर (या न ही इसे शून्य पर सेट करना, न ही तत्व बनाना) को संशोधित करना और यह भी काम करना प्रतीत होता है। तो, रिकार्ड के लिए: प्रत्येक स्रोत यहाँ बदल रहा है के लिए समारोह है:

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

आप पहले से ही अपने प्रश्न का उत्तर दिया है! ऑब्जेक्ट को हटाने से पहले 'music.pause()'। –

+3

क्या कोई कारण है कि आप नया गीत शुरू करने के लिए तैयार होने पर 'src' विशेषता को बदलना नहीं चाहते हैं? –

+0

@किनिस असल में, 'music.setAttribute ("src", music_Source); दूसरे संगीत के लिए नए संगीत_Source के साथ फिर से कॉल किया जाता है, इसलिए मुझे लगता है कि इसका मतलब है, मैं src विशेषता बदलता हूं। @ फ्रैंकिस एविला लेकिन मुझे सच में विश्वास नहीं है कि संगीत.pause() हटाने से पहले पिछले संगीत को किसी भी उचित तरीके से "हटाया" जा सकता है। या शायद मुझे कुछ याद आती है, या मैं खुद को पर्याप्त रूप से समझा नहीं सकता :) –

उत्तर

8

हटाने के बजाय, यह ऐसा करने का बेहतर तरीका src

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

कि जिस तरह से आप कर रहे हैं बदलने के लिए होगा हमेशा एक ही वस्तु के साथ काम कर ताकि आप कम अक्सर डोम मारा, और भी आप एक ही समय

इसके अलावा, आप .load विधि का उपयोग नए ऑडियो लोड करने के लिए सुनिश्चित करें कि कम दो खिलाड़ी होने की समस्या से बचने के, अन्यथा यह होगा पुराना खेलना जारी रखें।

+2

वास्तव में यह लोड() के बिना काम करता है, पिछला संगीत बंद हो जाता है और नया खेल शुरू होता है। ऐसा लगता है कि जब स्रोत बदल जाता है तो संगीत लोड हो जाता है (कम से कम क्रोम पर, जैसा कि मैं वेबकिट-विशिष्ट ऐप पर काम करता हूं)। लेकिन स्रोत बदलना वास्तव में समाधान है। –

2

मूल वस्तु हटा दी जाएगी, लेकिन केवल जब कचरा कलेक्टर निर्धारित करता है कि यह समय है। तथ्य यह है कि यह audio चीजों को जटिल बना सकता है और ब्राउज़र को यह दृढ़ संकल्प करना मुश्किल बनाता है।

तो, हां, इसके बजाए मूल वस्तु का पुनः उपयोग करें।

संबंधित मुद्दे