2009-12-16 9 views
22

मैं (मैं possiblities के बहुत सारे के बारे में सोच सकते हैं, लेकिन मैं सच कारण जानना चाहते हैं) इस के लिए एक सीधा जवाब तलाश रहे हैं:डोम एलिमेंट ऑब्जेक्ट्स में गुण जोड़ने के साथ क्या गलत है?

jQuery के साथ संबद्ध करते के लिए एक विधि .data() प्रदान करता है डोम तत्व वस्तुओं। यह क्या आवश्यक बनाता है? क्या डोम एलिमेंट ऑब्जेक्ट्स को सीधे गुण (या विधियों) जोड़ने में कोई समस्या है? यह क्या है?

उत्तर

41

क्या डोम एलिमेंट ऑब्जेक्ट्स को सीधे गुण (या विधियों) जोड़ने में कोई समस्या है?

संभावित

कोई वेब मानक आप डोम नोड्स मनमाने ढंग से गुण जोड़ सकते हैं का कहना है कि नहीं है। वे ब्राउज़र-विशिष्ट कार्यान्वयन के साथ 'होस्ट ऑब्जेक्ट्स' हैं, न कि 'देशी जावास्क्रिप्ट ऑब्जेक्ट्स' जो ईसीएमए -262 के अनुसार आप जो भी पसंद कर सकते हैं वह कर सकते हैं। अन्य होस्ट ऑब्जेक्ट्स आपको मनमानी गुणों को जोड़ने की अनुमति नहीं देंगे।

हकीकत में के बाद से जल्द से जल्द ब्राउज़र आपको यह करने के लिए अनुमति देने के लिए किया था, यह एक वास्तविक मानक है कि आप वैसे भी ... जब तक आप जानबूझकर आईई बता document.expando= false सेट करके आप उसे अस्वीकृत करने के लिए कर सकते हैं। आप शायद खुद ऐसा नहीं करेंगे, लेकिन यदि आप कहीं और तैनात करने के लिए एक स्क्रिप्ट लिख रहे हैं तो यह आपको चिंता कर सकता है।

एक व्यावहारिक समस्या यह है कि आप वास्तव में नहीं पता है कि मनमाने ढंग से नाम आपके द्वारा चुने गए कुछ ब्राउज़र आप अभी तक परीक्षण नहीं किया है, या एक में में एक मौजूदा अर्थ नहीं है में मनमाने ढंग से-गुणों के साथ नहीं है ब्राउज़र या मानक का भविष्य संस्करण जो अभी तक मौजूद नहीं है। एक संपत्ति जोड़ें, और आप यह सुनिश्चित नहीं कर सकते कि अंतरिक्ष और समय में कहीं भी कोई भी ब्राउज़र उस रोमांचक क्रोम सॉसेज को ब्राउज़र क्रैश सुविधा बनाने के लिए सिग्नल के रूप में उपयोग नहीं करेगा। तो यदि आप एक मनमानी संपत्ति जोड़ते हैं, तो इसे एक असंभव नाम देना सुनिश्चित करें, उदाहरण के लिए element._mylibraryname_sausage= true। यह अन्य स्क्रिप्ट घटकों के साथ नेमस्पेस विवादों को रोकने में भी मदद करता है जो मनमाने ढंग से गुण जोड़ सकते हैं।

कि गुण आप गलत तरीके से जोड़ने विशेषताओं के रूप में इलाज कर रहे हैं में IE में एक और समस्या है। यदि आप innerHTML के साथ तत्व को क्रमबद्ध करते हैं तो आपको आउटपुट में एक अप्रत्याशित विशेषता मिलेगी, उदाहरण के लिए। <p _mylibraryname_sausage="true">। यदि आप उस HTML स्ट्रिंग को किसी अन्य तत्व को असाइन करते हैं, तो आपको नए तत्व में एक संपत्ति मिल जाएगी, संभावित रूप से आपकी स्क्रिप्ट को भ्रमित कर रही है।

(ध्यान दें कि यह केवल गुण जिनके मान सरल प्रकार के होते हैं के लिए होता है, वस्तुओं, अरै, और फ़ंक्शन धारावाहिक HTML में दिखाई नहीं देती हैं।मेरी इच्छा है कि jQuery इस बारे में जानता था, क्योंकि data विधि को लागू करने के लिए यह जिस तरह से काम करता है, वह बिल्कुल भयानक है, बग में परिणाम होता है, और कई साधारण डीओएम ऑपरेशंस धीमा कर देता है।)

+3

+1, हालांकि मेरी इच्छा है कि आपने HTML5 ' डेटा- * 'भंडारण (http://dev.w3.org/html5/spec/Overview.html#attr-data)। JQuery से डब्लूआरटी, 'डेटा' स्टोरेज को 1 एक्समेरिक वैल्यू संग्रहीत करने वाले एक्सपो एट्रिब्यूट के रूप में कार्यान्वित किया गया है जो 'jQuery.cache' में एक कुंजी पर मैप करता है। सिद्धांत यह है कि 'jQuery.cache' को ब्राउज़र द्वारा अनलोड पर स्वतंत्र रूप से पुनः दावा किया जा सकता है क्योंकि यह किसी भी DOM तत्व से अनुपयुक्त है, और इसके विपरीत DOM तत्व को स्वतंत्र रूप से कचरा एकत्र किया जा सकता है क्योंकि यह किसी भी आत्म-संदर्भ ऑब्जेक्ट/फ़ंक्शन/आदि खुद पर। मुझे वहां समस्या नहीं दिख रही है? –

+7

समस्या है (1) jQuery को HTML पर 'jQuery (संख्या)' विशेषता को किसी भी समय HTML (जैसे 'html()' या 'क्लोन()') पर ऑपरेशन करना है। यह एक regex के माध्यम से स्ट्रिंग चिपकाने (uuuurrrrrgghhh) द्वारा करता है। तो यदि आप एक अनुच्छेद क्लोन करते हैं जिसमें पाठ 'jQuery0 = "foo" 'है, तो पाठ गायब हो जाएगा। (2) अब इसे आईडी, डीओएम ऑपरेशंस का ट्रैक रखना है जो त्वरित और आसान नहीं होना चाहिए। उदाहरण के लिए 'तत्व (हटाएं' तत्व को आज़माएं और देखें क्योंकि jQuery प्रत्येक अवरोही नोड में रिकॉर्ड्स करता है जो डेटा आईडी को फेंकने के लिए देखता है। ओह प्रिय। – bobince

+1

+1। सामान्य के रूप में महान जवाब। –

5

मैं तुम्हें, सभी गुण आप चाहते हैं जोड़ सकते हैं जब तक आप केवल उन्हें अपने उपयोग करने के लिए और संपत्ति एक विधि या कुछ तरीकों से युक्त वस्तु नहीं है के रूप में लगता है। इसके साथ क्या गलत है कि विधियां ब्राउज़र में मेमोरी लीक बना सकती हैं। विशेष रूप से जब आप closures का उपयोग ऐसे तरीकों से करते हैं, तो ब्राउज़र कचरा सफाई को पूरा करने में सक्षम नहीं हो सकता है जिससे स्मृति की बिखरी हुई जगहों पर कब्जा रहता है।

This link यह अच्छी तरह बताते हैं।

here आप कई आम स्मृति रिसाव पैटर्न

4

यह तथ्य यह है कि IE में डोम JScript, जो उपयोग करने के लिए यह पूरी तरह से अलग वातावरण बनाता द्वारा प्रबंधित नहीं है के साथ क्या करना है का एक विवरण मिल जाएगा। इससे मेमोरी लीक http://www.crockford.com/javascript/memory/leak.html की ओर जाता है। एक और कारण यह है कि, जब लोग नोड्स की प्रतिलिपि बनाने के लिए आंतरिक HTML का उपयोग करते हैं, तो उन सभी अतिरिक्त गुणों को स्थानांतरित नहीं किया जाता है।

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