2012-12-26 24 views
34

नहीं है चलो कहते हैं कि मैं HTML निम्नलिखित है दो:jQuery: अगले तत्व का पता लगाएं कि एक भाई

<span> 
    <span id="x1" class="x">X1</span> 
</span> 
<span> 
    <span> 
     <span id="x2" class="x">X2</span> 
    </span> 
</span> 

और $(this)<span id="x1" ...> है।

jQuery के साथ .x मिलान करने वाले अगले तत्व को खोजने का सबसे अच्छा तरीका क्या है?
वास्तविक दस्तावेज़ की संरचना अप्रत्याशित है, इसलिए प्रदान किया गया HTML केवल एक उदाहरण है।

मैं nextAll का उपयोग नहीं कर सकता क्योंकि यह केवल भाई बहन पाता है।
यदि मैं $('.x') करता हूं, तो यह सब पाता है, लेकिन मुझे फिर से तुलना करना/तुलना करना होगा।
क्या कोई बेहतर समाधान है?

यह भी देखें: http://jsfiddle.net/JZ9VW/1/

उत्तर

40

, वर्ग x साथ सभी तत्वों का चयन करें वर्तमान तत्व के सूचकांक की गणना और सूचकांक + 1 के साथ तत्व मिल:

var $x = $('.x'); 
var $next = $x.eq($x.index(this) + 1); 

यह काम करता है क्योंकि तत्वों दस्तावेज़ क्रम में चुने गए हैं। पृष्ठ लोड पर एक बार आपको केवल .x तत्वों का चयन करना होगा (यदि वे गतिशील रूप से बनाए गए नहीं हैं)।

+1

धन्यवाद, मैं 'सूचकांक के बारे में पता नहीं था()'। जब मैं एसओ (समय सीमा) की अनुमति देता है तो मैं स्वीकार करूंगा। –

+0

मेरा मतलब है, '.index' शायद तत्वों पर भी पुनरावृत्ति कर रहा है, लेकिन कम से कम आपको स्पष्ट रूप से ऐसा करने की आवश्यकता नहीं है। AFAIK यह एकमात्र तरीका है यदि आप नोड्स के बीच कोई अन्य संबंध नहीं जानते हैं। –

+0

यह वही है जो मुझे चाहिए; धन्यवाद। –

1

आप xpath इस्तेमाल कर सकते हैं:

document.evaluate('following::*[@class="x"], elt, null, XPathResult.ANY_TYPE, null); 

या आप एक वॉकर इस्तेमाल कर सकते हैं:

var walker = document.createTreeWalker(elt, NodeFilter.SHOW_ELEMENT, function(node) { 
    return node.classList.has('x'); 
}); 

while (walker.nextNode) { 
    do_something_with(walker.currentNode); 
} 
+0

मैं आपका बिंदु देखता हूं, लेकिन जब तक यह महत्वपूर्ण पथ नहीं है (और यह मेरे लिए नहीं है), जटिलता प्रदर्शन लाभ से अधिक होगी। इसके अलावा, क्या आप परिमाण के कई आदेशों के बारे में निश्चित हैं? यह किसी भी तरह से 'querySelector' आंतरिक रूप से उपयोग करना चाहिए। –

+0

मैं मानता हूं कि सीधे डीओएम को संसाधित करना आमतौर पर तेज़ होता है, लेकिन यदि आप ऐसा दावा करते हैं, तो आपको इसे http://jsperf.com/ परीक्षण के साथ वापस लेना चाहिए। –

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