2013-09-26 9 views
5

को हटाने अगर मैंजावास्क्रिप्ट ईवेंट हैंडलर नोड

var link = document.createElement("a"); 

document.body.appendChild(link); 


link.addEventListner("click",function(){ 

    alert("do something"); 

}); 

की तरह किसी भी तत्व पर ईवेंट हैंडलर जोड़ने जावास्क्रिप्ट में और उसके बाद मैं हटाने लिंक

link.parrentNode.removeChild(link); 

तो क्या घटना के बारे में है कि मैं लिंक करने के लिए संलग्न के बाद होगा इसे भी हटाया जाएगा या यह स्मृति में रहेगा (स्मृति में कितनी देर तक संग्रहीत किया जाता है और कितनी देर तक) में उलझन में है या मुझे पहले ईवेंट हैंडलर को हटा देना चाहिए और फिर मैं लिंक नोड को हटा दूंगा।

+0

आप घटनाओं को संलग्न नहीं करते हैं, आप किसी ईवेंट के लिए श्रोता संलग्न करते हैं (इसलिए विधि का नाम)। श्रोता केवल तब तक मौजूद होता है जब तक ऑब्जेक्ट (डीओएम तत्व) यह अस्तित्व में संलग्न होता है। – RobG

उत्तर

1

जावास्क्रिप्ट फ़ंक्शन एक्सप्रेशन में (आपके केस इवेंट बाध्यकारी में) किसी ऑब्जेक्ट को आवंटित करता है और इसलिए स्मृति का उपभोग करता है। आपको इसे ठीक से हटा देना चाहिए या इसे संभालना चाहिए। इस लिंक को जांचें जो स्मृति प्रबंधन को विस्तार से बताता है।

Js Memory Management

चेक कचरा संग्रहण अनुभाग।

3

कचरा कलेक्टर का आह्वान होने पर लगभग सभी ब्राउज़र स्मृति से ईवेंट हैंडलर को हटा देंगे। हालांकि, आईई 6 और नीचे एक ज्ञात बग है जो इवेंट हैंडलर को कचरा नहीं ले सकता है जिससे पृष्ठ को स्मृति को रिसाव किया जा सकता है।

इसे तत्व को हटाने से पहले ईवेंट हैंडलर को साफ करने के लिए अच्छा अभ्यास माना जाता था (वास्तव में, वाईयूआई और जेक्वियर जैसे पुस्तकालयों के लिए इसके कार्य हैं)। लेकिन इन दिनों मैं केवल इस बारे में चिंता करता हूं अगर आप आईई 6 की परवाह करते हैं।


नोट: यदि आप बग के बारे में सोच रहे हैं। यह इस तथ्य के कारण है कि आईई का कचरा कलेक्टर गोलाकार संदर्भों को संभाल नहीं सकता है अगर इसमें डीओएम शामिल है (पुराने आईई पर यह परिपत्र संदर्भों को संभाल नहीं सकता है, भले ही इसमें डीओएम शामिल न हो)।

इसलिए उदाहरण के लिए, अगर आप इस तरह कोड है:

myDiv.onclick = function() { myDiv.style.backgroundColor = 'red' } 
//        ^
//        | 
//      circular reference 

तो IE6 और नीचे ईवेंट हैंडलर मुक्त नहीं कर सका। लेकिन अगर आपके ईवेंट हैंडलर में डीओएम ऑब्जेक्ट पर वापस कोई सर्कुलर संदर्भ नहीं है, तो यह तब से जुड़ा होगा जब आईई कचरा इकट्ठा करेगा।

+0

संबंधित प्रश्न से लिंक करें: http://stackoverflow.com/questions/10092619/precise-explanation-of-javascript-dom-circular-reference-issue – slebetman

+0

आईई 6 और 7 * addEventListener * का समर्थन नहीं करते हैं, इसलिए इस मामले में वे सिर्फ एक त्रुटि फेंक देंगे। ;-) – RobG

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