2009-05-09 7 views
61

Dla niektórych powodów wydajności, próbuję znaleźć sposób na wybranie tylko węzłów siostrzanych wybranego węzła. Na przykład,Czy istnieje sposób wyboru węzłów siostrzanych?

<div id="outer"> 
     <div id="inner1"> </div> 
     <div id="inner2"> </div> 
     <div id="inner3"> </div> 
     <div id="inner4"> </div> 
</div> 

Jeśli wybrany węzeł inner1, czy jest jakiś sposób dla mnie, aby uzyskać dostęp do jego rodzeństwa, inner2-4 węzły?

Odpowiedz

94

Cóż ... na pewno ... po prostu wejdź do rodzica, a następnie do dzieci.

node.parentNode.childNodes[] 

... lub przy użyciu jQuery:

$('#innerId').siblings() 

Edycja: Cletus jak zawsze inspiruje. Wykopałem dalej. W ten sposób jQuery pobiera rodzeństwa zasadniczo:

function getChildren(n, skipMe){ 
    var r = []; 
    for (; n; n = n.nextSibling) 
     if (n.nodeType == 1 && n != skipMe) 
      r.push(n);   
    return r; 
}; 

function getSiblings(n) { 
    return getChildren(n.parentNode.firstChild, n); 
} 
+15

Zauważ, że jquery.siblings() wyłącza bieżący węzeł ze zbioru wynikowego. – cletus

+2

Co jest bardzo fajną funkcją! – cgp

+1

Właściwie odpowiednikiem node.parentNode.childNodes [] w jquery jest naprawdę $ (node) .parent(). Children() not $ (node) .siblings(). To może być fajna funkcja, ale może być też denerwująca. To zależy od tego, czego chcesz. – cletus

-1
var childNodeArray = document.getElementById('somethingOtherThanid').childNodes; 
+0

window.document.documentElement.childNodes [1] .childNodes [4] podniósł z http://www.howtocreate.co.uk/tutorials/javascript/dombasics – Thunderboltz

+0

czy to jakieś rozwiązanie pytania w ogóle? – zahid9i

+0

Nie rozwiązuje to problemu, a przynajmniej nie jest wystarczająco jasne, aby było przydatne. – cdeszaq

66
var sibling = node.nextSibling; 

to natychmiast zwróci rodzeństwo po niej lub null nie więcej rodzeństwa są dostępne. Podobnie można użyć previousSibling.

[Edytuj] Po drugie, nie da to następnego znacznika div, ale białych znaków za węzłem. Wydaje się być lepszym

var sibling = node.nextElementSibling; 

Istnieje również previousElementSibling.

+0

next/previousElementSibling nie jest obsługiwany w IE8 – Vadim

+0

Począwszy od IE9 jest. Zobacz także http://stackoverflow.com/questions/5197825/parentnode-lub-previouselementsibling-not-working-in-ie8 – parvus

6

Czy sprawdziłeś metodę "Rodzeństwo" w jQuery?

sibling: function(n, elem) { 
     var r = []; 

     for (; n; n = n.nextSibling) { 
      if (n.nodeType === 1 && n !== elem) { 
       r.push(n); 
      } 
     } 

     return r; 
    } 

n.nodeType == 1 Sprawdź, czy element jest węzłem html i n! == wykluczenia aktualny element.

Myślę, że można użyć tej samej funkcji, cały kod wydaje się być vanilla javascript.

6

Istnieje kilka sposobów, aby to zrobić.

Jedna z poniższych czynności powinna wystarczyć.

// 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 kod baza jest doskonałym źródłem do obserwowania Grade A Javascript.

Oto doskonałe narzędzie, które odsłania bazę kodu jQuery w bardzo opływowy sposób. http://james.padolsey.com/jquery/

-2
x1 = document.getElementById('outer')[0] 
     .getElementsByTagName('ul')[1] 
     .getElementsByTagName('li')[2]; 
x1.setAttribute("id", "buyOnlineLocationFix"); 
1

Zastosowanie document.querySelectorAll() i Loops and iteration

function sibblingOf(children,targetChild){ 
 
    var children = document.querySelectorAll(children); 
 
    for(var i=0; i< children.length; i++){ 
 
    children[i].addEventListener("click", function(){ 
 
     for(var y=0; y<children.length;y++){children[y].classList.remove("target")} 
 
     this.classList.add("target") 
 
    }, false) 
 
    } 
 
} 
 

 
sibblingOf("#outer >div","#inner2");
#outer >div:not(.target){color:red}
<div id="outer"> 
 
     <div id="inner1">Div 1 </div> 
 
     <div id="inner2">Div 2 </div> 
 
     <div id="inner3">Div 3 </div> 
 
     <div id="inner4">Div 4 </div> 
 
</div>

-1

Oto jak można dostać poprzedni, następny i wszystkie rodzeństwo (obie strony):

function prevSiblings(target) { 
    var siblings = [], n = target; 
    while(n = n.previousElementSibling) siblings.push(n); 
    return siblings; 
} 

function nextSiblings(target) { 
    var siblings = [], n = target; 
    while(n = n.nextElementSibling) siblings.push(n); 
    return siblings; 
} 

function siblings(target) { 
    var prev = prevSiblings(target) || [], 
     next = nexSiblings(target) || []; 
    return prev.concat(next); 
} 
4

Szybkie:

var siblings = n => [...n.parentElement.children].filter(c=>c!=n) 

https://codepen.io/anon/pen/LLoyrP?editors=1011

Get dzieci rodzica jako tablica, odfiltrować ten element.

+1

Dobre rozwiązanie. Chociaż, sprawdziłbym nodeType, aby odrzucić węzeł tekstowy '[... n.parentNode.children] .filter (c => c.nodeType == 1 && c! = N)' – pmrotule

2

Od 2017:
Prosta odpowiedź: element.nextElementSibling za uzyskanie odpowiedniego elementu rodzeństwa. również masz element.previousElementSibling do poprzedniego

stąd jest dość prosta dostał wszystko następna sibiling

var n = element, ret = []; 
while (n = n.nextElementSibling){ 
    ret.push(n) 
} 
return ret; 
+0

Powinien zwrócić wszystkie rodzeństwo, nie tylko 'next' lub' previous'. Określanie dokładnego przechodzenia do tyłu lub do przodu nie pomaga w tym przypadku. – dvLden

+1

dlaczego nie. jeśli zrobisz następny i poprzedni, możesz uzyskać cały obraz. to odpowiedź, która pokazuje nowy sposób robienia rzeczy. i wnieść coś do czytelników. po prostu przejdź do rodzica i idź do każdego elementu i odfiltruj bieżący, który każdy może zrobić –

Powiązane problemy