मान लीजिए कि मेरे पास दो कॉलम लेआउट वाला एक पृष्ठ है जहां बाएं कॉलम लिंक का एक सेट है और यह लिंक क्लिक होने पर संबंधित कॉलम पृष्ठ/टेम्पलेट को दाएं कॉलम में लोड करता है।घटनाक्रम और डोम तत्व
एक टेम्पलेट लोड हो रहा है पर, वहाँ एक टेम्पलेट हैंडलर कि requirejs के माध्यम से एक सिंगलटन के रूप में प्रारंभ हो जाता है है और यह कुछ तरीकों और तरह संचालकों को परिभाषित करता है:
SomePage.prototype.saveHandler: function(e) { ... }; // Page handler has a handler
SomePage.prototype.initialize: function() {
$('#btnSave').on('click', saveHandler);
}
फिर, मैं एक इनिशियलाइज़ विधि के माध्यम से डोम घटनाओं संलग्न कर रहा हूँ हर समय पृष्ठ लोड होता है।
SomePage.initialize(); // This attaches the click event
अब, जब मैं दाईं ओर से एक लिंक पर क्लिक करें, एक अलग टेम्पलेट पृष्ठ लोड होता है और इसके बाद के संस्करण की प्रक्रिया उस पृष्ठ के लिए दोहराता है।
मुझे आश्चर्य है कि क्लिक ईवेंट के साथ क्या होता है जो पहले btnSave तत्व से जुड़ा हुआ था? क्या यह अब jQuery कैश में एक खतरनाक घटना हैंडलर है?
यदि मैं उसी पृष्ठ को दोबारा लोड करता हूं तो इसे हटाने का प्रयास करता हूं, क्या यह वास्तव में मूल घटना को हटा देगा?
$('#btnSave').off('click', saveHandler);
क्या निम्न ब्लॉक निष्पादित करने से स्मृति लीक/लटकती संदर्भों को रोकता है?
// The potential problem here is that btnSave is part of the newly loaded template
// and not the element i attached the handler to earlier (which doesn't exist anymore)
$('#btnSave').off('click', saveHandler);
$('#btnSave').on('click', saveHandler);
यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि मैं लटकने वाले संदर्भों और मेमोरी लीक के साथ समाप्त नहीं होता हूं। यह सादा जावास्क्रिप्ट के लिए भी एक संभावित सवाल है। मेरी समझ यह है कि टेम्पलेट पेज रीफ्रेश होने पर उपरोक्त काम नहीं करेगा। मैं इस बीच प्रयोग कर रहा हूं, लेकिन यह जानना अच्छा होगा कि विशेषज्ञ इसे कैसे संभालेंगे। धन्यवाद!
मैं निश्चित रूप से 'ऑफ' और फिर 'ठीक' पर उपयोग करता हूं, जैसा आपने किया था। लेकिन क्या आप टेम्पलेट को फिर से लोड करने से पहले 'off' * को कॉल करने के लिए कोई संभावित तरीका है? – dthree
मैंने उस पैटर्न को समाधान के रूप में सोचा है, लेकिन मुझे यकीन नहीं है कि मुझे इसकी आवश्यकता है क्योंकि jQuery इसे आंतरिक रूप से संभाला जा सकता है।यदि प्रत्येक पृष्ठ ने एक इंटरफेस लागू किया है और वर्तमान पृष्ठ के रूप में खुद को लोड करने पर, तो एक वैश्विक लिंक हैंडलर app.cache.currentPage.cleanup() जैसे कुछ कर सकता है जिसमें सभी बंद हो सकते हैं। – theoutlander
मुझे लगता है कि आप सही हैं कि यह ऐसा करने से भूत तत्व बनाता है ... – dthree