2012-05-07 9 views
6

मैंने अपने नेविगेशन को संशोधित करने के लिए एक jQuery प्लगइन बनाया है। दुर्भाग्यवश मुझे लगभग सभी बाल तत्वों जैसे <ul>, <li>, <a> और इतनी आगे तक पहुंचने और संशोधित करना होगा। उन तत्वों को तब एक और चार बार के बीच की आवश्यकता होती है।परिवर्तनीय वृद्धि प्रदर्शन में चयनित/पाए गए तत्वों को संग्रहित करता है?

क्या मुझे उन्हें सभी चरों में स्टोर करना चाहिए या मुझे $('.my-nav').find('li') या $('.my-nav').find('li') की आवश्यकता होने पर उन्हें एक्सेस करना चाहिए?

यह कोड की 25 लाइनों के लिए 5 चर के लिए स्मृति की बर्बादी की तरह लगता है। लेकिन मुझे नहीं पता कि यह अधिक प्रदर्शन के लिए स्वीकार्य व्यापार-बंद है या नहीं। http://jsfiddle.net/Yj35Q/2/

+0

धन्यवाद, मैंने पहेली को सही किया। –

उत्तर

8

हमेशा अच्छा अभ्यास अपने नोड्स कैश करने के लिए:

मैं वर्णन करने के लिए क्या मतलब है एक फिडल बनाया। आप http://jsperf.com/

का उपयोग करके स्वयं को बेंचमार्क भी कर सकते हैं, आपको वास्तव में चिंता करने की आवश्यकता नहीं है कि स्टोरेज स्पेस वेरिएबल्स को कितनी आवश्यकता है जब तक आप बड़े पैमाने पर डोम पेड़ या कुछ संग्रहीत नहीं कर लेते। नोड्स का पता लगाने के लिए जेएस इंजन को कितना काम करना है।

संपादित
या और भी बेहतर, आप और एक मौजूदा परीक्षण का मामला कोई पहले से ही
http://jsperf.com/ns-jq-cached/4

+0

धन्यवाद, यह स्पष्ट रूप से अंतर दिखाता है। –

2

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

मैं आमतौर पर वैश्विक चरों में डोम नोड्स को कैश नहीं करूँगा क्योंकि मैं वैश्विक चर से बचने की कोशिश करता हूं और किसी विशेष कार्य के लिए आवश्यक होने पर डोम नोड को पुनर्प्राप्त करने के लिए शायद ही कभी एक प्रदर्शन समस्या होती है। वैश्विक चरों में डीओएम संदर्भों से बचने का एक अन्य कारण यह है कि यदि डीओएम से कोई विशेष डोम नोड हटा दिया जाता है और यदि आप ग्लोबल वैरिएबल में इसका संदर्भ रखते हैं, तो आप कचरा इकट्ठा करने का इरादा रखते हैं, तो डोम नोड नहीं होगा कचरा इकट्ठा किया गया है और एक स्मृति रिसाव का कारण बन सकता है।

कुछ ऐसे मामले हैं जहां मैं बार-बार एक ही डोम नोड (जैसे टाइमर पर) देख रहा हूं, जहां मैं एक कार्य बंद करने में डीओएम नोड को गैर-ग्लोबल वैरिएबल में कैश कर दूंगा और फिर स्थानीय रूप से उस चर का उपयोग करूँगा। लेकिन, मुझे ऐसे मामले मिलते हैं जहां दुर्लभ होने की आवश्यकता होती है।

+0

+1। और मुझे बताएं कि आप मेरे आलसी लोडिंग jQuery चयनकर्ता के बारे में क्या सोचते हैं। –

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। अक्सर, कई उत्तरों मैं स्वीकार करना चाहता हूं लेकिन दुर्भाग्य से केवल एक ही कर सकता है। fritzfromlondon थोड़ा तेज था। –

+0

@ जॉन बी। - fritzfromlondon का जवाब और मेरा उत्तर विभिन्न सिफारिशों के साथ अलग-अलग उत्तर हैं। मुझे लगता है कि आप उस व्यक्ति के लिए वोट देंगे जो आपको अधिक समझ में आता है या दूसरे के सामने कुछ मिनट पहले की तुलना में अधिक पूर्ण लगता है। मैं आपसे अलग जवाब चुनने का विरोध नहीं कर रहा हूं, सिर्फ यह कि आपके मानदंड पहले नहीं आए थे जब उत्तर अलग होते हैं। – jfriend00

3

यह उचित है कि आप अपने डीओएम तत्वों को कैश करना उचित है, चाहे आप jQuery का उपयोग कर रहे हों या नहीं।

लेकिन इस सवाल से मुझे यह सोचने लगा कि शायद हमारे पास इसकी मदद करने के लिए एक प्लगइन होना चाहिए। मैंने चारों ओर खोज की और एक नहीं मिला।

तो मैंने एक वास्तव में त्वरित लिखा। यह एक lazy loading jQuery selector है ...

(function($){ 
    var cachedObjects = new Array(); 

    $.lazy = function(selector) { 
     if (typeof selector != "string" || arguments.length > 1) 
      return $.apply(this, arguments); 

     var o = cachedObjects[selector]; 
     if (o == undefined) 
     { 
      o = $(selector); 
      cachedObjects[selector] = o; 
     } 

     return o; 
    }; 
})(jQuery); 

आप इस तरह उसका प्रयोग करेंगे ...

$.lazy('.my-nav').show(); 

मुझे पता है कि अगर मैं कुछ भी अनदेखी न कर दें। लेकिन मेरा मानना ​​है कि जब भी आप जिन तत्वों का चयन कर रहे हैं, वे स्थिर हैं और गतिशील रूप से कभी भी जोड़े या हटाए नहीं जाते हैं।

अद्यतन

मैं इस अधिक कुशल बनाने के कोड बदल दिया है। और जब चयनकर्ता स्ट्रिंग नहीं है तो मैंने return $(selector) पर एक पंक्ति जोड़ दी है। तो कैशिंग केवल तभी काम करेगी जब चयनकर्ता एक स्ट्रिंग है।

अद्यतन # 2

अब यह return $.apply(this, arguments) जब आप बस एक स्ट्रिंग गुजर नहीं कर रहे हैं होगा, jfriend00 के सुझाव के अनुसार।

+0

एक दिलचस्प विचार। तो, '$ (चयनकर्ता) के बजाय .fadeOut()', '' $ .lazy (selector) .fadeOut() 'का उपयोग करता है। मेरा सुझाव है कि आप यह सुनिश्चित कर लें कि चयनकर्ता एक स्ट्रिंग है और यह अधिक कुशल हो सकता है जब इसे पहले से ही 'कैश ऑब्जेक्ट्स' में फिर से देखने के बाद इसे कैश नहीं किया जाता है। – jfriend00

+0

@ jfriend00 - अच्छे विचार। मैं आज रात बाद इन बदलावों को कर दूंगा। –

+0

मैं सुझाव दूंगा कि आप 'if (typeof selector! = "String") $ (selector) लौटाएं;' to: 'if (typeof selector! =" String "|| arguments.length> 1) $ वापसी करें .apply (यह, तर्क); 'तो यह सभी स्वीकार्य jQuery तर्कों के लिए काम करता है। – jfriend00

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