2012-04-04 10 views
9

तोड़ता है मैंने why it's better और how it's implemented पढ़ा है। लेकिन मैं वास्तव में समझ में नहीं आता यह परिपत्र संदर्भ को कैसे तोड़ता है?कैसे jQuery डेटा() गोलाकार संदर्भ

यह संदर्भ मंडल को कैसे तोड़ता है?

$(div1).data('item', div2); 
$(div2).data('item', div1); 

उदाहरण के लिए, उपरोक्त divs एक दूसरे को इंगित करते हैं, यह कैसे रोका जाता है? मेरे पास एक झटका है, लेकिन मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि मेरा हंच सही है या नहीं।

उत्तर

12

सर्कुलर संदर्भ समस्या कुछ ब्राउज़रों में होती है जब आप किसी DOM ऑब्जेक्ट पर किसी DOM ऑब्जेक्ट पर किसी DOM ऑब्जेक्ट पर किसी DOM ऑब्जेक्ट पर संदर्भ डालते हैं। फिर, आपके पास एक दूसरे पर इशारा करते हुए दो डोम ऑब्जेक्ट्स हैं। उस पर एक कस्टम संपत्ति के साथ एक DOM ऑब्जेक्ट को निकालना उस कस्टम प्रॉपर्टी को साफ़ नहीं करता है। एक कचरा कलेक्टर जो स्मार्ट नहीं है, यह महसूस नहीं करता है कि यह डोम संदर्भ गिनता नहीं है, इसलिए यह अटक जाता है और कई तरीके हैं जिससे इससे लीक हो सकती है।

.data() इस समस्या को हल करता है क्योंकि .data() डेटा DOM ऑब्जेक्ट पर नहीं है। यह सिर्फ एक जावास्क्रिप्ट डेटा संरचना है जिसे एक अद्वितीय स्ट्रिंग आईडी के माध्यम से DOM ऑब्जेक्ट से जोड़ा जा सकता है। लेकिन जब भी आप .data("key", "myData") के साथ लिखते हैं, तो यह कभी भी जावास्क्रिप्ट डेटा संरचना के लिए डीओएम ऑब्जेक्ट को नहीं लिखता है।

इस प्रकार, .data() कभी भी डीओएम ऑब्जेक्ट को डेटा नहीं लिखता है, इसलिए इनमें से किसी भी प्रकार के परिपत्र संदर्भ नहीं हो सकते हैं जिनमें कुछ ब्राउज़रों को परेशानी होती है।

.data() डेटा संरचना के बारे में जानने के लिए कुछ अन्य उपयोगी चीजें हैं। जब आप DOM से तत्वों को निकालने के लिए jQuery के .remove() का उपयोग करते हैं या जब आप $(elem).html("new html") पर कॉल करते हैं, तो jQuery किसी भी हटाए गए आइटम पर .data() डेटा साफ़ करता है। यह एक ऐसा मामला है जहां सादे जावास्क्रिप्ट के साथ jQuery को मिश्रित करना अच्छा नहीं है। यदि आप .data() का उपयोग कर रहे हैं, तो आपको हमेशा jQuery कार्यों का उपयोग करके DOM से आइटम्स को हटा देना चाहिए ताकि .data() उचित रूप से साफ़ हो। अन्यथा, आप इस तरह मेमोरी लीक प्राप्त कर सकते हैं (.data() दोनों डेटा रिसाव कर सकते हैं और .data() में संदर्भित किसी भी हटाए गए डीओएम ऑब्जेक्ट्स रिसाव कर सकते हैं। लेकिन, यदि आप केवल डोम से आइटम हटाने के लिए jQuery विधियों का उपयोग करते हैं (आंतरिक HTML की जगह सहित), तो jQuery चीजों को उचित रूप से एक स्मृति रिसाव को साफ करेंगे और वहाँ कोई लीक हो जाएगा

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

// suppose elem is a DOM element reference 

// store some data in jQuery's data storage on behalf of a DOM element 
$(elem).data("someKey", "someValue"); 

// remove DOM element with plain Javascript 
elem.parentNode.removeChild(elem); 

क्योंकि आप सादे जावास्क्रिप्ट, jQuery के साथ डोम तत्व हटाया आपके द्वारा पहले संग्रहीत डेटा को साफ़ करने का कोई मौका नहीं था। डीओएम तत्व स्वयं कचरा इकट्ठा होगा, लेकिन .data() मूल्य जो आपने पहले किया था लाल अब jQuery के भंडारण में अनाथ है और अनिवार्य रूप से एक "रिसाव" है क्योंकि इसे कभी भी साफ़ नहीं किया जाएगा। दूसरी ओर, यदि आप ऐसा करते हैं:

$(elem).data("someKey", "someValue"); 
$(elem).remove(); 

फिर, jQuery कि आप डोम तत्व निकाल रहे हैं देखेंगे और आप .data() के साथ संग्रहीत डेटा साफ हो जाएगा।

यह देखने का एक आसान तरीका है कि यह कैसे काम करता है jQuery के एक गैर-न्यूनतम संस्करण के साथ एक दो पंक्ति स्क्रिप्ट बनाना है और फिर डीबगर में $(elem).data("key", "whatever") पर कॉल के माध्यम से कदम उठाएं और देखें कि यह कैसे काम करता है।

+0

क्या आप उदाहरण के साथ अनुच्छेद 5 पर अपनी व्याख्या को चित्रित कर सकते हैं? –

+0

@ techloris_109 - उदाहरण जोड़ा गया। – jfriend00

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