2011-01-17 14 views
16

ऐसा कुछ साफ दिखता है जो "अंतर्निहित" हो सकता है लेकिन मुझे लगता है कि यह अभी भी पूछने लायक है।एन लेवल चिल्ड्रन के माध्यम से इटरेटिंग

मुझे एक समस्या है जहां इसे आसानी से तत्व के सभी बच्चों के माध्यम से हल करके हल किया जा सकता है। मैंने हाल ही में खोज की है कि मुझे उन मामलों के लिए खाते की आवश्यकता है जहां मुझे "1 स्तर" (सिर्फ एक बार कॉलिंग) (केवल एक बार कॉलिंग) की तुलना में एक स्तर या दो गहराई करने की आवश्यकता होगी। मैं वर्तमान में कर रहा हूं।

jQuery.each(divToLookAt.children(), function(index, element) 
    { 
     //do stuff 
    } 
    ); 

यही वह है जो मैं कर रहा हूं। दूसरी परत गहरी जाने के लिए, मैं प्रत्येक तत्व के लिए सामान कोड करने के बाद एक और पाश चलाता हूं।

jQuery.each(divToLookAt.children(), function(index, element) 
{ 
    //do stuff 
    jQuery.each(jQuery(element).children(), function(indexLevelTwo, elementLevelTwo) 
    { 
     //do stuff 
    } 
    ); 
} 
); 

यदि मैं अभी तक एक और स्तर गहरा जाना चाहता हूं, तो मुझे यह सब फिर से करना होगा।

यह स्पष्ट रूप से अच्छा नहीं है। मुझे एक "स्तर" चर घोषित करना अच्छा लगेगा और फिर यह सब ख्याल रखेगा। किसी के पास एक स्वच्छ कुशल jQueryish समाधान के लिए कोई विचार है?

धन्यवाद!

+0

आप elemtns में क्या देख रहे हैं? – amosrivera

+0

+1 क्योंकि मुझे आश्चर्य है कि jquery के लिए मूल चयनकर्ता नहीं है, और क्योंकि मैं मैन्युअल डोम ट्रैवर्सल लॉल को याद करता हूं। – goat

उत्तर

6

यह गहरा पकड़ स्तर के कारण एक शानदार सवाल है। Check out the fiddle

इसे एक प्लगइन में कनवर्ट किया गया।

सक्रिय

$('#div').goDeep(3, function(deep){ // $.fn.goDeep(levels, callback) 
    // do stuff on `this` 
}); 

प्लगइन

$.fn.goDeep = function(levels, func){ 
    var iterateChildren = function(current, levelsDeep){ 
     func.call(current, levelsDeep); 

     if(levelsDeep > 0) 
      $.each(current.children(), function(index, element){ 
       iterateChildren($(element), levelsDeep-1); 
      }); 
    }; 

    return this.each(function(){ 
     iterateChildren($(this), levels); 
    }); 
}; 
+0

कुछ सीमित क्षमता आगंतुक होने के बजाय इसे केवल सामान भरें। अधिक jquery'ish/लचीला आईएमओ। – goat

+0

@chris - मैं नहीं देख सकता कि कंटेनर के साथ सभी तत्वों को कैसे प्राप्त किया जा रहा है, फिर गतिशील चयनकर्ता के आधार पर फ़िल्टरिंग अधिक लचीला/कुशल हो सकती है –

0
var lvlFunc = function(elmt, depth) { 
    if(depth > 0) { 
     elmt.children().each(function(i, e){ 
      // do stuff on the way down 
      lvlFunc($(this), --depth); 
      // do stuff on the way out 
     }); 
     // do stuff 
    } 
}; 

lvlFunc(divToLookAt, 3); 

यकीन है कि आप अगर मामलों "सामान" आदेश में किया जाता है सही स्थान में अपने "सामान है" कोड डाल सुनिश्चित करें।

+1

'--depth' काम नहीं करेगा fyi –

2

यह सवाल है भयानक :-)

हैं क्या आप जानते हैं अपने डोम भी विशाल नहीं है, तो आप सिर्फ सभी सन्तान खोजने के लिए और जो कि योग्य नहीं है बाहर फ़िल्टर कर सकते हैं:

var $parent = $('#parent'); 
var $childrenWithinRange = $parent.find('*').filter(function() { 
    return $(this).parents('#parent').length < yourMaxDepth; 
}); 

उसके बाद, jQuery उदाहरण "$ childrenWithinRange" होगा उस माता-पिता के सभी बच्चे नोड <div> जो कुछ अधिकतम गहराई के भीतर हैं। यदि आप वास्तव में उस गहराई को चाहते थे, तो आप "<" को "===" पर स्विच करेंगे। मैं कहीं से दूर हो सकता है।

+0

+1 इस तरह मैं इसे करूँगा, जब तक मुझे लगा कि मैं बहुत गहरी वंशजों के लिए बहुत अधिक चीजें नहीं कर रहा हूं। – goat

1

तुम बस all-selector(docs), child-selector(docs) और इस तरह multiple-selector(docs) साथ यह करने के लिए सक्षम होना चाहिए:

उदाहरण:http://jsfiddle.net/mDu9q/1/

$('#start > *,#start > * > *,#start > * > * > *').doSomething(); 

...या यदि आप केवल बच्चों 3 स्तरों गहरी लक्षित करना चाहता है, तो आप ऐसा कर सकते हैं:

उदाहरण:http://jsfiddle.net/mDu9q/2/

$('#start > * > * > *').doSomething(); 

इन चयनकर्ताओं के दोनों querySelectorAll के लिए मान्य हैं, जो बड़ा प्रदर्शन को बढ़ावा देने का मतलब है समर्थित ब्राउज़र में।

1

प्रश्न जैसा लगता है कि उत्तर XPATH हो सकता है। मैं अच्छी तरह से ब्राउज़र-समर्थन के बारे में सूचित नहीं कर रहा हूँ, लेकिन XPATH में आप केवल

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