2012-04-07 10 views
14

क्या यह अनुशंसा की जाती है कि, जब मुझे किसी फ़ंक्शन के दायरे में एक से अधिक बार jQuery चयनकर्ता के परिणाम तक पहुंचने की आवश्यकता हो, तो मैं चयनकर्ता को एक बार चलाता हूं और इसे स्थानीय चर में असाइन करता हूं?स्थानीय चर के बनाम jQuery चयनकर्ताओं का प्रदर्शन

यहां मेरे पतंग उदाहरण को क्षमा करें, लेकिन मुझे लगता है कि यह सवाल दिखाता है। तो, यह कोड तेजी से प्रदर्शन करेंगे:

var execute = function(){ 
    var element = $('.myElement'); 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

इस कोड से:

var execute = function(){ 
    $('.myElement').css('color','green'); 
    $('.myElement').attr('title','My Element'); 
    $('.myElement').click(function(){ 
     console.log('clicked'); 
    }); 
} 

अगर वहाँ कोई अंतर नहीं है, किसी को भी क्यों की व्याख्या कर सकते? क्या jQuery उन्हें चुनने के बाद कैश तत्वों को कैश करता है ताकि बाद के चयनकर्ताओं को फिर से डोम को खोजने की परेशानी न हो?

+0

आपके उत्तरों के लिए सभी को धन्यवाद, मेरी इच्छा है कि मैं उन्हें सभी – KodeKreachor

उत्तर

18

संबद्ध है, निश्चित रूप से तेजी से होता है।

http://jsperf.com/caching-jquery-selectors

उत्तरार्द्ध मामले, अपने चयनकर्ताओं को पुनर्परिभाषित, ~ के रूप में 35% धीमी बताया जाता है: यहाँ एक परीक्षण मैं सबूत के रूप में किया जाता है।

+0

कूल टेस्ट, बहुत अच्छा, लेकिन मैं उलझन में हूं ... लाल बार 'स्थानीय परिवर्तनीय' उदाहरण का प्रतिनिधित्व करता है, क्योंकि यह लेबल कहता है? ऐसा लगता है कि इसमें अधिक समय लगेगा? – KodeKreachor

+0

हाँ, लाल स्थानीय चर है। यह थोड़ा उलझन में है, चार्ट में अब बेहतर है। यह दर्शाता है कि प्रति सेकेंड कितने ऑपरेशन चलाए जा सकते हैं। – weotch

+0

मुझे उस साइट पर पेश करने के लिए धन्यवाद। यह बढ़िया है! – tsherif

3

स्थानीय चर में संदर्भ संग्रहीत करना प्रत्येक बार चयन कोड चलाने से तेज़ होगा। जब आप इसे एक चर में संग्रहीत करते हैं तो उचित तत्व (ओं) को खोजने के लिए किसी भी कोड को निष्पादित करने की बात नहीं है। अंगूठे का मेरा नियम एक चर में jQuery लुकअप के परिणामों को संग्रहीत करना है यदि मैं इसे एक से अधिक बार उपयोग करने जा रहा हूं।

1

यहाँ एक अन्य विकल्प चयनकर्ता दोहरा के बजाय एक each उपयोग करने के लिए है, और यह चयनकर्ता संदर्भ, अपने पहले मामले पुनर्प्रयोग काम करते हैं, बार-बार

var execute = function(){ 
    $('.myElement').each(function() { 
     var elem = $(this); 
     elem.css('color','green'); 
     elem.attr('title','My Element'); 
     elem.click(function(){ 
     console.log('clicked'); 
     }); 
    }); 
} 
+1

स्वीकार कर सकूं यदि आप प्रदर्शन में रूचि रखते हैं, ऑब्जेक्ट्स के लिए बार-बार स्मृति आवंटित करते हैं और अनावश्यक फ़ंक्शन कॉल करते हैं (दिए गए हैं, वे काफी तेज़ होते हैं) एक ही तत्व के लिए $ (यह) 'ओवर और ओवर आदर्श से कम है। –

+1

* "अंतर 'attr' फ़ंक्शन में है। यदि आप इसे किसी संग्रह में लागू करते हैं तो यह केवल संग्रह में पहले तत्व को प्रभावित करता है।" * नहीं, यह * प्राप्त * पर ही सही है। * सेट * पर, यह उन सभी के लिए सेट करता है: http://api.jquery.com/attr/#attr2 –

+0

@ टीजे।मेरे बुरे क्रॉउडर, मैंने उस विधि के हस्ताक्षर को नहीं देखा जो मैं दस्तावेज़ों को पढ़ रहा था। – tvanfosson

8

इस एक को न भूलें:

var execute = function(){ 
    $('.myElement') 
     .css('color','green') 
     .attr('title','My Element') 
     .click(function(){ 
      console.log('clicked'); 
     }); 
} 
+0

@weotch ग्रेट। मैं इतना तेज़ नहीं था इसलिए मेरा समान जवाब रद्द कर दिया ... लेकिन यह जानना बहुत अच्छा है कि यह एक विकल्प है। क्या हम इसे अपनी गति परीक्षण में जोड़ सकते हैं? –

+1

+1। यह वह समाधान है जो jQuery ने कल्पना की होगी क्योंकि उनके अधिकांश उदाहरण इस तरह श्रृंखला श्रृंखलाओं को एक साथ करते हैं। शायद यह स्थानीय चरों में बचत से तेज़ नहीं है, लेकिन यह कई चयनों से निश्चित रूप से तेज़ है और मैं तर्क दूंगा कि यह अधिक सुरुचिपूर्ण है। – Neil

+2

उस परीक्षण को जोड़ा गया। यह पहले के लिए बंधे दिखता है! – weotch

0

तुम वास्तव में सही मायने में कैश की गई दृष्टिकोण भूल रहे हैं।

jQuery के साथ बात यह है कि प्रारंभिक लुकअप: $('.selector') महंगा है। लेकिन उसके बाद, अपने कार्यों को उस पर चेन करना, या इसे एक चर के लिए असाइन करना और चर पर अपने कार्यों को निष्पादित करना इससे कोई फर्क नहीं पड़ता। मुख्य प्रदर्शन लाभ जो आप प्राप्त कर सकते हैं वह तत्व को और भी कैश कर रहा है, और jQuery चयनकर्ता को आपके फ़ंक्शन कॉल के प्रत्येक पुनरावृत्ति को असाइन नहीं कर रहा है।

var element = $('.myElement'); 
var execute = function(){ 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

यह दृष्टिकोण अन्य दृष्टिकोणों के सबसे तेज़ संस्करण के रूप में लगभग दोगुना तेज़ है।

देखें http://jsperf.com/caching-jquery-selectors/17

नोट: यदि आपका डोम परिवर्तन के दौरान यह जीवन है, तो आप तत्वों की एक ताजा चयन के साथ element चर को अपडेट करें।

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