2010-04-13 16 views
7

यदि मैं किसी तत्व पर किसी ईवेंट को पंजीकृत करने के लिए addEventListener का उपयोग करता हूं, तो ईवेंट को हटाए बिना तत्व को हटाएं और मैंने बार-बार ऐसा किया है कि मैं मेमोरी लीक बना सकता हूं?जावास्क्रिप्ट addEventListener मेमोरी-लीक्स प्रश्न

उत्तर

4

इसे रिसाव नहीं करना चाहिए। एक ब्राउज़र जो नरक की तरह लीक करने के लिए कुख्यात है जब एक ईवेंट हैंडलर होस्ट-ऑब्जेक्ट <> जेएस-ऑब्जेक्ट लूप आईई (संस्करण 7 तक) है, और आईई (संस्करण 8 तक) addEventListener का समर्थन नहीं करता है।

इसे चलाएं और देखें कि लंबे समय तक ब्राउज़र का मेमोरी उपयोग कैसे प्रभावित होता है, यदि आप किसी विशेष ब्राउज़र में इसका परीक्षण करना चाहते हैं।

<div id="x"></div> 
<script type="text/javascript"> 
    function replace() { 
     var x= document.getElementById('x'); 
     if (x.firstChild!==null) 
      x.removeChild(x.firstChild); 
     var el= document.createElement('p'); 
     el.addEventListener('click', click, false); 
     x.appendChild(el); 
    } 
    function click() { 
     alert('click'); 
    }; 
    setInterval(replace, 1); 
</script> 

(एक संदर्भ पाश वर्तमान के साथ यह परीक्षण करने के लिए, replace शरीर में ऊपर ले जाने के function click परिभाषा।)

0

आप स्मृति रिसाव हो जाएगा अगर आप डोम, तत्वों है कि श्रोताओं संलग्न किया है से हटा दें। लेकिन यह केवल आईई, एफएक्स और अन्य में होता है उन्नत जीसी है।

अक्सर ऐसा होता है अगर आप डोम के माध्यम से नहीं डोम तत्वों के साथ हेरफेर, लेकिन जैसे

el.innerHTML = ... 

उदाहरण के लिए, YUI कस्टम प्राप्ति setInnerHTML, इस मामले में स्मृति रिसाव को रोकने के लिए है।

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