8

मान लीजिए कि मैंने विभिन्न प्रकार के ईवेंट श्रोताओं को विभिन्न फॉर्म तत्वों से जोड़ा है। बाद में, मैं पूरे फॉर्म को हटाना चाहता हूं।क्या जावास्क्रिप्ट इवेंट श्रोताओं को उस तत्व को हटाने से पहले हटा दिया जाना चाहिए?

क्या यह आवश्यक है (या सुझाया गया है) फॉर्म और उसके तत्वों पर मौजूद किसी भी ईवेंट हैंडलर को अनधिकृत करने के लिए? यदि हां, तो सभी श्रोताओं को तत्वों के संग्रह पर हटाने का सबसे आसान तरीका क्या है? ऐसा करने का क्या असर नहीं है? यदि यह मायने रखता है, तो मैं प्रोटोटाइप का उपयोग कर रहा हूं।

यहां मैं वास्तव में क्या कर रहा हूं। मैं इस तरह एक सरल रूप है,:

<form id="form"> 
    <input type="text" id="foo"/> 
    <input type="text" id="bar"/> 
</form> 

मैं इनपुट पर विभिन्न घटनाओं का निरीक्षण, जैसे:

$('foo').observe('keypress', onFooKeypress); 
$('bar').observe('keypress', onBarKeypress); 

आदि

रूप AJAX के माध्यम से प्रस्तुत किया जाता है और प्रतिक्रिया एक है फॉर्म की नई प्रति। मैं पुराने फॉर्म को $('form').replace(newForm) जैसे कुछ करने की प्रतिलिपि के साथ प्रतिस्थापित करता हूं। क्या मैं घटना क्रुफ्ट का एक गुच्छा जमा कर रहा हूं?

उत्तर

3

हाँ, थोड़ा सा। एक बड़ी समस्या होने के लिए पर्याप्त नहीं है, लेकिन आईई के पुराने संस्करण उन परिस्थितियों में रिसाव करेंगे।

प्रोटोटाइप 1.6.1 (वर्तमान में इसके अंतिम रिलीज उम्मीदवार में) के रूप में, लाइब्रेरी पेज अनलोड पर इस सफाई को संभालती है। जब आप इवेंट पर्यवेक्षक जोड़ने के लिए प्रोटोटाइप का उपयोग करते हैं, तो यह उस तत्व का संदर्भ किसी सरणी में रखता है; पेज अनलोड पर, यह उस सरणी के माध्यम से loops और अपने सभी पर्यवेक्षकों को हटा देता है।

हालांकि, यदि उपयोगकर्ता थोड़ी देर के लिए इस पृष्ठ पर रहने जा रहा है, तो स्मृति उपयोग पृष्ठ के जीवन में जमा हो जाएगा।

  1. रूप है, एक है कि प्रतिस्थापित हो जाता है कभी नहीं के पूर्वज पर घटनाओं के लिए सुनो: आप कई विकल्प हैं। फिर, अपने हैंडलर में, जांचें कि ईवेंट कहां से आया था। (यानी, "घटना प्रतिनिधिमंडल")

  2. Element#replace पर कॉल करने से पहले अपने सभी कॉलों को स्पष्ट रूप से अन-रजिस्टर करें। अपने उदाहरण में, आप क्या करना चाहते हैं:

    $('foo', 'bar').each(Element.stopObserving); 
    

यह कोई तर्क है, जो सभी हैंडलर निकाल दिए गए तत्व पर की प्रभाव पड़ता है साथ stopObserving बुला के बराबर है।

मैं विकल्प की सिफारिश करेंगे 1.

(हम Element#update और Element#replace के हिस्से के रूप प्रोटोटाइप के भविष्य के संस्करण में स्वत: श्रोता हटाने करने के बारे में बात की है, लेकिन यह एक प्रदर्शन व्यापार बंद है।)

4

ऐसी घटनाएं जो अनियंत्रित नहीं हैं, उनकी स्मृति स्वचालित रूप से मुक्त नहीं हो सकती हैं। यह आईई के पुराने संस्करणों में विशेष रूप से एक समस्या है।

प्रोटोटाइप के लिए स्वचालित कचरा संग्रहण प्रणाली होती थी, लेकिन विधि 1.6 में विधि हटा दी गई है। यह here दस्तावेज है। क्या विधि को हटाने का मतलब है कि कचरा संग्रह अब नहीं होता है, या विधि अभी सार्वजनिक रूप से उपलब्ध नहीं है, मुझे नहीं पता। यह भी ध्यान रखें कि इसे केवल पृष्ठ अनलोड पर ही बुलाया गया था, जिसका अर्थ है कि यदि आपके उपयोगकर्ता बहुत सारे AJAX और DOM अपडेट करते समय एक ही पृष्ठ पर रहते हैं, तो स्मृति उस पृष्ठ के दौरे के दौरान भी एक अस्वीकार्य सीमा तक पहुंच सकती है।

0

जोनास ने नीचे वर्णित परिदृश्य के मामले में डीओएम से निकाले गए तत्वों से किसी भी ईवेंट श्रोताओं को हटाने के लिए हमेशा अच्छा होता है।

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

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