2011-09-08 16 views
9

मैं जावास्क्रिप्ट का उपयोग करके भाई बहनों को "ऊपर" कैसे देख सकता हूं? असल में, मुझे jQuery में मौजूद एक के समान prevUntil() फ़ंक्शन की आवश्यकता है।पुस्तकालयों के बिना जावास्क्रिप्ट में भाई बहनें

<div></div> 
<div></div> 
<div></div> 
<div></div> 
<div></div> 
<div></div> 

मैं एक क्लिक किए गए तत्व पर शुरू होते हैं और अपने रास्ते एक ही है कि एक वर्ग से मेल खाता है जब तक भाई बहन पेड़ पर काम करना चाहते हैं:

मैं इस तरह के रूप <div> तत्वों, एक ही स्तर पर सभी के बहुत सारे है, नाम मानदंड तक पहुंच गया है, फिर बंद करो।

मैं यह कैसे कर सकता हूं, कृपया?

+1

@glowcoder: व्यक्तिगत रूप से मुझे यह जानना दिलचस्प लगता है कि jQuery वास्तव में * क्या कर रहा है *। – pimvdb

+2

@pimvdb, jQuery ओपन सोर्स है, अगर आप वास्तव में क्या कर रहे हैं और सबसे महत्वपूर्ण बात यह है कि यह कैसे कर रहा है, तो इसके स्रोत कोड से परामर्श करने में संकोच नहीं करें। –

+1

@ डारिन डिमिट्रोव: मुझे पता है, मेरा मतलब है कि दृश्यों के पीछे क्या हो रहा है यह पूछने में कुछ भी गलत नहीं है। – pimvdb

उत्तर

9

यह उत्तर पहले इसी प्रश्न के जवाब में here प्रकाशित हुआ था।

ऐसा करने के कुछ तरीके हैं।

इनमें से किसी एक को चाल चलनी चाहिए।

// METHOD A (ARRAY.FILTER, STRING.INDEXOF) 
var siblings = function(node, children) { 
    siblingList = children.filter(function(val) { 
     return [node].indexOf(val) != -1; 
    }); 
    return siblingList; 
} 

// METHOD B (FOR LOOP, IF STATEMENT, ARRAY.PUSH) 
var siblings = function(node, children) { 
    var siblingList = []; 
    for (var n = children.length - 1; n >= 0; n--) { 
     if (children[n] != node) { 
      siblingList.push(children[n]); 
     } 
    } 
    return siblingList; 
} 

// METHOD C (STRING.INDEXOF, ARRAY.SPLICE) 
var siblings = function(node, children) { 
    siblingList = children; 
    index = siblingList.indexOf(node); 
    if(index != -1) { 
     siblingList.splice(index, 1); 
    } 
    return siblingList; 
} 

FYI करें: jQuery कोड आधार ग्रेड ए जावास्क्रिप्ट के अवलोकन के लिए एक महान स्रोत है।

यहां एक उत्कृष्ट उपकरण है जो jQuery कोड-बेस को एक बहुत सुव्यवस्थित तरीके से प्रकट करता है। http://james.padolsey.com/jquery/

1

वहाँ HTML डोम

यहाँ में एक previousSibling संपत्ति है कुछ संदर्भ

http://reference.sitepoint.com/javascript/Node/previousSibling

+0

संपत्ति 'पिछली सिब्लिंग' एक डीओएम नोड का संदर्भ है, न कि एक समारोह। –

+0

मैं इसे पूरी तरह से समझता हूं। लेकिन कुछ सरल पुनरावृत्ति के साथ आप इसका उपयोग पिछले तत्व को ढूंढने के लिए कर सकते हैं जो उसकी परिस्थितियों से मेल खाता है। –

1

बस how jQuery does it पर एक नज़र है।

prevUntil: function(elem, i, until) { 
    return jQuery.dir(elem, "previousSibling", until); 
}, 

जो थोड़ी देर/लूपिंग फ़ंक्शन का उपयोग करता है dir()। पिछली बार previousSibling तक चलती रहती है until तत्व के समान होती है।

dir: function(elem, dir, until) { 
    var matched = [], 
     cur = elem[ dir ]; 

    while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { 
     if (cur.nodeType === 1) { 
      matched.push(cur); 
     } 
     cur = cur[dir]; 
    } 
    return matched; 
}, 
4

उपयोग .children.parentNode के साथ संयोजन में। फिर इसे NodeList फ़िल्टर करें, इसे किसी सरणी में परिवर्तित करने के बाद: http://jsfiddle.net/pimvdb/DYSAm/

var div = document.getElementsByTagName('div')[0]; 
var siblings = [].slice.call(div.parentNode.children) // convert to array 
       .filter(function(v) { return v !== div }); // remove element itself 
console.log(siblings); 
+0

'[] .slice.call (nl) 'के साथ ऐरे कास्टिंग करने के लिए नोडलिस्ट। अच्छा ':)' –

+0

ग्रेट समाधान, धन्यवाद! – Kholiavko

7

Example का उपयोग previousSibling:

var className = "needle"; 
    var element = clickedElement; 
    while(element.previousSibling && element.previousSibling.className != className) { 
     element = element.previousSibling; 
    } 
    element.previousSibling; // the element or null 
+0

यह 'element.previousSibling.className' समस्याग्रस्त है। यदि कोई पिछला भाई वांछित वर्ग नहीं है, तो 'element.previousSibling' अंत में' शून्य 'वापस कर देगा, इसलिए 'element.previousSibling.className' एक त्रुटि फेंक देगा। –

+2

वह अनंत लूप को रोकने के लिए था! मजाक कर रहा हूं। मैंने – Joe

+0

अपडेट किया है, धन्यवाद, लड़के के साथ लंबे नाम। – Francisc

2

कैसे इस बारे में:

while (node = node.previousElementSibling) { 
    if ((' ' + node.className + ' ').indexOf('foo') !== -1) { 
     // found; do your thing 
     break; 
    } 
} 

मुझे बता कि इस IE8 में काम नहीं करता है परेशान न हों ...

+0

क्या आप धोखा देना चाहते हैं? चूंकि मैं आपको धोखा नहीं दूंगा क्योंकि मैं आपके प्रश्न का उत्तर नहीं दे सकता क्योंकि आपने मुझसे नहीं पूछा था। – Wayne

+0

@Wayne नहीं, मुझे धोखा नहीं होना पसंद है। मैंने आपसे नहीं पूछा कि मेरे प्रश्न का उत्तर न दें। कृपया इसका उत्तर दें! और मैंने क्या पूछा? मैंने सोचा कि मैंने एक सवाल का जवाब दिया है, एक नहीं पूछा। –

+0

मेरे हिस्से पर खेद है गलतफहमी। मैंने सोचा था कि आप मुझे नहीं बताते हैं कि यह आईई 8 में सचमुच काम नहीं करता है ... नहीं कि आप पहले ही जानते हैं। – Wayne

0

आपको मूल रूप से GetElementsByTagName मिल गया है और getElementsByName वे एरे वापस करते हैं और जंगली कार्ड का उपयोग कर सकते हैं। यदि आप चाहते हैं कि आपको कोई फ़ंक्शन बनाने या किसी लाइब्रेरी की तरह पहले से मौजूद किसी चीज़ का उपयोग करने की आवश्यकता न हो।

function getElements() 
    { 
    var x=document.getElementsByName("*"); 
    alert(x.length); 
    } 

अद्यतन

getElementByID सिर्फ एक तत्व देता है।

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