2009-05-09 8 views
61

По некоторым причинам производительности я пытаюсь найти способ выбрать только узлы-близнецы выбранного узла. Например,Есть ли способ выбора узлов-братьев?

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

Если я выбрал inner1 узел, есть ли способ для меня, чтобы получить доступ к своим братьям и сестрам, inner2-4 узлов?

ответ

94

Ну ... конечно ... просто обращайтесь к родителям, а затем к детям.

node.parentNode.childNodes[] 

или ... с помощью JQuery:

$('#innerId').siblings() 

Edit: Клетуса как всегда вдохновляет. Я потянулся дальше. Это как JQuery получает брат и сестра по существу:

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

Обратите внимание, что jquery.siblings() исключает текущий узел из набора результатов. – cletus

+2

Это очень приятная функция! – cgp

+1

Фактически эквивалент node.parentNode.childNodes [] в jquery действительно $ (node) .parent(). Children() not $ (node) .siblings(). Это может быть приятная функция, но она также может быть раздражающей. Это зависит от того, что вы хотите. – cletus

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

window.document.documentElement.childNodes [1] .childNodes [4] взято из http://www.howtocreate.co.uk/tutorials/javascript/dombasics – Thunderboltz

+0

это любое решение вопроса? – zahid9i

+0

Это не решает проблему, или, по крайней мере, недостаточно ясно, чтобы быть полезной. – cdeszaq

66
var sibling = node.nextSibling; 

Это немедленно вернуть брат после этого, или нуля не больше братий и сестер доступны. Аналогично, вы можете использовать previousSibling.

[Изменить] С другой стороны, это не даст следующий тег div, но пробел после узла. Лучше, кажется,

var sibling = node.nextElementSibling; 

Там также существует previousElementSibling.

+0

next/previousElementSibling не поддерживается в IE8 – Vadim

+0

Начиная с IE9. См. Также http://stackoverflow.com/questions/5197825/parentnode-or-previouselementsibling-not-working-in-ie8 – parvus

6

Вы проверили метод «Sibling» в 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 проверить, если элемент является HTML узел и п! == исключить текущий элемент.

Я думаю, вы можете использовать ту же функцию, все, что код, кажется, ванильный javascript.

6

Существует несколько способов сделать это.

Любой из следующих способов должен сделать трюк.

// 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 является большим ресурсом для наблюдения Grade A Javascript.

Вот отличный инструмент, который очень хорошо раскрывает кодовую базу jQuery. http://james.padolsey.com/jquery/

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

Использование document.querySelectorAll() и 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

Вот как вы могли бы получить предыдущий, следующий и все братья и сестры (с обеих сторон):

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

Быстрые:

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

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

Получить ребенок родителя в качестве массива, отфильтровывать этот элемент.

+1

Хорошее решение. Хотя, я бы проверить, чтобы nodeType отбрасывал текстовый узел '[... n.parentNode.children] .filter (c => c.nodeType == 1 && c! = N)' – pmrotule

2

От 2017:
простой ответ: element.nextElementSibling для получения правильного элемента родственного брата. Также у вас есть element.previousElementSibling за предыдущий один

здесь довольно просто получили весь последующий sibiling

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

Он должен возвращать всех братьев и сестер не только 'next' или' previous'. Указание точно идущего назад или вперед не помогает в этом случае. – dvLden

+1

почему бы и нет. если вы возьмете следующий и предыдущий, вы сможете получить всю картину. Это ответ, чтобы показать новый способ сделать что-то. и вносить что-то для читателей. просто пойти родителем и пройти каждый элемент и фильтровать текущий, который каждый может сделать –

 Смежные вопросы

  • Нет связанных вопросов^_^