2012-01-09 14 views
10

मैं divs के डैशबोर्ड के साथ काम कर रहा हूं और प्रत्येक div में इसका एक पेड़ है जिसमें बटन हैं। हर बार मुझे पता होना चाहिए कि उस div की आईडी कौन है इसलिए मैं अभिभावक() बहुत कुछ उपयोग कर रहा हूं।अभिभावक(), तेज़ विकल्प?

अधिकतर मैं div की आईडी खोजने के लिए $(this).parent().parent().parent() कर रहा हूं इसलिए मैं इसे चर सेट कर सकता हूं। ऐप प्रत्येक div के आईडी पर आधारित है।

क्या यह माता-पिता() तक 3 बार तक धीमा मानता है लेकिन हर समारोह पर बहुत अधिक है?

क्या कोई अन्य विकल्प है?

मैं कुछ ऐसे बेंचमार्क-स्टाइल की तलाश में हूं जो दिखाता है कि तेज़ क्या है। , $(this).closest('.dashdiv')

यह देखने का एक इंजन के दृष्टिकोण से किसी भी तेजी से नहीं है, क्योंकि आप कर रहे हैं:

<div id="6179827893" class="dashdiv"> 
    <div class="buttons"> 
    <li><a href="#" class="btn1">Button 1</a></li> 
    <li><a href="#" class="btn2">Button 2</a></li> 
    <li><a href="#" class="btn3">Button 3</a></li> 
    <li><a href="#" class="btn4">Button 4</a></li> 
    <li><a href="#" class="btn5">Button 5</a></li> 
    <li><a href="#" class="btn6">Button 6</a></li> 
    </div> 
    <div class="dashcontent"> 

    .... 

    </div> 
</div> 
+0

शायद: चयनकर्ता एक समाधान है। http://api.jquery.com/contains-selector/ – ggzone

+0

क्या आप माता-पिता के सीएसएस वर्ग का नाम शायद जानते हैं? –

उत्तर

17

आपके पास एक ही प्रभाव प्राप्त करने के लिए कुछ विकल्प हैं।

बेंचमार्क: http://jsperf.com/parents-method। इस बेंचमार्क के अनुसार, मेरी विधि आपकी विधि से लगभग 100x तेज है।

Method (see below) : Operations per second (higher is better) 
parentNode3x  : 4447k 
$(parentNode3x) : 204K 
$().closest  : 35k 
$().parents  : 9k 
$().parent()3x  : 44k 

// Likely the fastest way, because no overhead of jQuery is involved. 
var id = this.parentNode.parentNode.parentNode.id; 

// Alternative methods to select the 3rd parent: 
$(this.parentNode.parentNode.parentNode) // Native DOM, wrapped in jQuery 

// Slowpokes 
$(this).closest('.dashdiv')    // Hmm. 
$(this).parents('.dashdiv:first')  // Hmm... 
+0

के लिए क्या आपका दूसरा विकल्प मेरे पास तेज़ है? मुझे लगता है कि पैरेंट नोड का मतलब है माता-पिता() – jQuerybeast

+0

@jQuerybeast मैंने एक बेंचमार्क शामिल किया है: http://jsperf.com/parents-method –

+0

धन्यवाद और बेंचमार्क के लिए। – jQuerybeast

8

आप से बेहतर हो सकता है, .closest() का उपयोग कर इस तरह:

यहाँ पेड़ का एक उदाहरण है अभी भी डोम परतों के माध्यम से लूपिंग, लेकिन यह एक नवागंतुक के साथ ही कम कोड के लिए और अधिक स्पष्ट है।

टीका

यह शुद्ध गति आप के बाद हो, तो आप के रूप में अच्छी jQuery पूरी तरह छोड़ सकते हैं और बजाय node.parentNode का उपयोग हो सकता है। लेकिन यह चक्रों की गिनती के घबराहट के मुद्दों में हो रहा है, और मुझे लगता है कि यह एक अकादमिक है।

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

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

इसके बजाय, अगले डेवलपर के बारे में सोचने के लिए यह और अधिक महत्वपूर्ण है जो आपके कोड को देखेगा। उस डेवलपर के लिए, स्पष्ट, अच्छी तरह से लिखित कोड होना महत्वपूर्ण है जो तुरंत यह बताता है कि यह क्या कर रहा है। तरीकों में से parent().parent().parent() तरह नेत्र धुंधला चेन अस्पष्ट और भ्रमित कर सकते हैं अन्य डेवलपर्स, node.parentNode.parentNode.parentNode

का कुछ भी नहीं कहने के लिए - जिसके कारण .closest() पहली जगह में बनाया गया था। यह स्पष्ट, संक्षिप्त, और उल्लेखनीय रूप से कम श्रृंखला की तुलना में कम कुशल नहीं है। हजारों में 999 बार, यह वही तरीका है जिस पर आपको जाना चाहिए।

+0

निकटतम को तेज़ नहीं माना जाता है। jQuery को उस नज़दीक की खोज करनी है जहां माता-पिता – jQuerybeast

+0

हां नहीं, यह मेरा विचार था। लेकिन मुझे लगता है कि स्पष्ट, अधिक संक्षिप्त कोड के बदले में यहां एक छोटा सा त्याग किया जाना है। यदि यह शुद्ध गति है तो आप पूरी तरह से jQuery को छोड़ सकते हैं और इसके बजाय ['node.parentNode'] (https://developer.mozilla.org/En/DOM/Node.parentNode) का उपयोग कर सकते हैं। – Blazemonger

+0

धन्यवाद। अच्छा जवाब दिया। चयनित रोब का जवाब जो मैं उपयोग करूँगा और बेंचमार्क – jQuerybeast

2

सबसे पहले, समय से पहले अनुकूलित न करें। यदि यह कोई समस्या नहीं पैदा कर रहा है (और प्लेटफॉर्म की एक श्रृंखला में सभी माध्यमों से पूरी तरह से परीक्षण करें) तो इसके बारे में चिंता न करें।

एक संभव अनुकूलन है: देशी डोम गुण का उपयोग करें:

var id = this.parentNode.parentNode.parentNode.id; 

नोट अच्छा jQuery तरीका यह है कि (जो धीमी हो जाएगा, लेकिन यह है कि एक समस्या नहीं हो सकता है) closest साथ है:

$(this).closest('div.dashdiv').prop('id'); 
+0

मुझे निकटतम के बारे में पता है लेकिन शायद यह सबसे धीमा है और ऐप बड़ा और बड़ा हो जाता है जो दर्द होगा। मुझे लगता है कि रोब डब्ल्यू ने कहा था, parentNode तेज़ अधिकार होगा? – jQuerybeast

+1

@jQuerybeast हाँ: [यह jQuery आंतरिक रूप से उपयोग करता है] (https://github.com/jquery/jquery/blob/master/src/traversing.js#L179)। – lonesomeday

+0

हा! लिंक पर अच्छा है। अपने 'समय से पहले अनुकूलन न करें' को ध्यान में रखते हुए मुझे यकीन नहीं है कि मुझे पैरेंट नोड के साथ अभिभावक() को स्वैप करना चाहिए या इसे छोड़ दें क्योंकि यह – jQuerybeast

1

संचालकों <a> तत्वों पर वर्तमान में कर रहे हैं, बजाय उन्हें .dashdiv तत्वों पर रखें।

तब आप this.id कर सकते हैं यदि e.target<a> तत्व था।

$('.dashdiv').click(function(e) { 
    if(e.target.nodeName.toLowerCase() === 'a') { 
     alert(this.id); 
    } 
}); 
संबंधित मुद्दे