2009-04-16 11 views
6

एक विशेष स्क्रिप्ट में मैं लिख रहा हूं, मेरे पास कई ऑब्जेक्ट्स हैं जो कुछ डोम तत्वों से जुड़े हुए हैं। यह देखते हुए कि प्रत्येक तत्व में एक अद्वितीय आईडी है, क्या प्रत्येक ऑब्जेक्ट केवल तत्व की आईडी रखे (और प्रत्येक बार document.getElementById का उपयोग करें), या किसी संपत्ति में तत्व को संग्रहीत करें?डीओएम तत्वों के संदर्भों को संग्रहीत करना

यहाँ मैं क्या मतलब है की एक सरल उदाहरण है:

function myThing(elId) { 
    this.elId = elId; 
} 
myThing.prototype.getElValue = function() { 
    return document.getElementById(this.elId).nodeValue; 
}; 

// -- vs -- // 

function myThing(elId) { 
    this.el = document.getElementById(elId); 
} 
mything.prototype.getElValue = function() { 
    return this.el.nodeValue; 
}; 

यह कोई फर्क पड़ता है? क्या मुझे कोई प्रदर्शन समस्या है जिसके बारे में मुझे पता होना चाहिए?

उत्तर

4

मैं तत्व संग्रहित करता हूं; जब आप दस्तावेज़ को कॉल नहीं कर रहे हैं तो यह कोड स्पष्ट हो जाता है .getElementById हर समय, और यद्यपि आपके मामले में आपको आईडी बदलने या आईडी के बिना तत्वों को अनुमति देने की आवश्यकता नहीं हो सकती है, ऐसा करना बहुत आम है।

(apphacker के विपरीत मैं ऐसा करने से विशाल दक्षता में सुधार उम्मीद होती है नहीं, के रूप में getElementById काफी ब्राउज़रों में अच्छी तरह से अनुकूलित हो जाता है।)

वहाँ किसी भी प्रदर्शन के मुद्दों के बारे में मैं पता होना चाहिए? डोम वस्तुओं के लिए जावास्क्रिप्ट वस्तुओं से

संदर्भ अपने दम पर ठीक हैं, लेकिन जब एक डोम वस्तु (आमतौर पर एक ईवेंट हैंडलर के माध्यम से) वापस एक लिंक जैसे किसी JavaScript वस्तु है, आप एक संदर्भ चक्र मिल गया है। यह IE6-7 को स्मृति को रिसाव करने का कारण बनता है क्योंकि यह साइकिल वाली वस्तुओं को मुक्त करने में विफल रहता है। छोटे सरल ऐप्स के लिए आपको परवाह नहीं है। जटिल, लंबे समय तक चलने वाले ऐप्स के लिए, आपको समस्या के आसपास काम करना पड़ सकता है, उदाहरण के लिए प्रत्येक ईवेंट हैंडलर को लुकअप मैप/सरणी के माध्यम से अप्रत्यक्ष करके, इसलिए वास्तविक ईवेंट हैंडलर को DOM ऑब्जेक्ट से कोई प्रत्यक्ष संदर्भ नहीं है।

3

तत्व को आईडी नहीं स्टोर करें, देखो धीमा और महंगा है और आपको फ़ंक्शन कॉल सहेजता है। मुझे लगता है कि एक साधारण परीक्षण इसकी पुष्टि करेगा।