2010-02-22 9 views
129

यहां किसी न किसी तरह एचटीएमएल मैं के साथ काम शुरू कर दिया गया है:jQuery वर्ग के साथ करीबी पिछले भाई को खोजने के

<li class="par_cat"></li> 
<li class="sub_cat"></li> 
<li class="sub_cat"></li> 
<li class="par_cat"></li> // this is the single element I need to select 
<li class="sub_cat"></li> 
<li class="sub_cat"></li> 
<li class="sub_cat current_sub"></li> // this is where I need to start searching 
<li class="par_cat"></li> 
<li class="sub_cat"></li> 
<li class="par_cat"></li> 

मैं, .current_sub से पार निकटतम पिछले .par_cat खोजने की जरूरत है और इसे करने के लिए सामान है।

.find("li.par_cat").par_cat के पूरे लोड रिटर्न (मैं पृष्ठ पर के बारे में 30 मिल गया है)। मुझे एक को लक्षित करने की ज़रूरत है।

वास्तव में कोई सुझाव :) सराहना करेंगे

+4

वाह, बिल्लियों वास्तव में सभी इंटरनेट पर कर रहे हैं! अब हमारे पास बिल्लियों और उप बिल्लियों भी हैं। –

उत्तर

225

प्रयास करें:

$('li.current_sub').prevAll("li.par_cat:first"); 

अपने मार्कअप के साथ यह परीक्षण किया गया:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo"); 

निकटतम पिछले li.par_cat "वूहू" के साथ भर जाएगा।

+0

आपको करीम धन्यवाद। यह भी अच्छी तरह से काम करता है, लेकिन मुझे लगता है कि .prev() कम संसाधनों को खाएगा, क्योंकि .prevAll को पिछले सभी मिलान किए गए तत्व मिलेंगे और फिर मुझे जिसकी आवश्यकता होगी उसे फ़िल्टर करेंगे। एड के जवाब को स्वीकार करना। – daulex

+3

वास्तव में, कुछ पाठ के बाद, .prev() कुछ मामलों में विफल रहा। .prevAll के साथ: पहले, हर बार काम किया। धन्यवाद। – daulex

+1

.prev() केवल तुरंत पिछले तत्व की जांच करता है। मैंने jsFiddle उदाहरण के साथ नीचे दिए गए उत्तर में टिप्पणी को जोड़ा। चारों ओर देखने के बाद, यह सबसे अच्छा जवाब है, हालांकि इसे सभी तत्वों के माध्यम से चक्र करना पड़ता है, फिर इसे खोजने के लिए फ़िल्टर करने के लिए दो कार्यों की आवश्यकता नहीं होती है। –

18

prevUntil का उपयोग करना() हम सभी को प्राप्त करने के लिए बिना एक दूर के भाई पाने के लिए अनुमति देगा

$('li.current_sub').prev('.par_cat').[do stuff]; 

+0

दोह, पूरी तरह से काम किया, जो मैंने सोचा था उससे आसान तरीका था। धन्यवाद। – daulex

+0

कोई समस्या नहीं: हम सभी के पास उन क्षण हैं;) –

+15

रुको, क्या? क्या यह केवल तत्काल तत्व की जांच नहीं करता है? इस प्रकार आपका कोड शून्य वापस आ जाएगा?- यहां यह जेएसफ़िल्ड पर परीक्षण किया गया है: http://jsfiddle.net/Y2TEH/ –

10

की कोशिश करो। मेरे पास एक विशेष रूप से लंबा सेट था जो prevAll() का उपयोग करके बहुत सी CPU गहन था।

var category = $('li.current_sub').prev('li.par_cat'); 
if (category.length == 0){ 
    category = $('li.current_sub').prevUntil('li.par_cat').last().prev(); 
} 
category.show(); 

यह पहली पूर्ववर्ती भाई अगर यह मेल खाता हो जाता है, अन्यथा यह भाई एक से मेल खाता है पूर्ववर्ती हो जाता है, तो हम बस वापस ऊपर एक पिछला के साथ और अधिक() वांछित तत्व प्राप्त करने के लिए।

3

मुझे लगता है कि सभी उत्तरों में कुछ कमी है। मैं इस

$('li.current_sub').prevUntil("li.par_cat").prev(); 

आपको जोड़ने से बचाता है: पहले चयनकर्ता के अंदर और पढ़ने और समझना आसान है। prevUntil() विधि prevAll उपयोग करने के बजाय साथ ही एक बेहतर प्रदर्शन किया है()

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