형제 노드를 선택하는 방법이 있습니까?


104

성능상의 이유로 선택한 노드의 형제 노드 만 선택하는 방법을 찾으려고합니다.

예를 들면

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

inner1 노드를 선택한 경우 형제 inner2-4노드 에 액세스 할 수있는 방법이 있습니까?

답변:


141

글쎄요 ... 물론 이죠. 부모와 아이들에게 접근하세요.

 node.parentNode.childNodes[]

또는 ... jQuery 사용 :

$('#innerId').siblings()

편집 : 클레 터스는 항상 영감을줍니다. 나는 더 파다. 이것은 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);
}

23
jquery.siblings ()는 결과 집합에서 현재 노드를 제외합니다.
cletus

3
아주 좋은 기능입니다!
cgp

1
실제로 jquery의 node.parentNode.childNodes []에 해당하는 것은 실제로 $ (node) .siblings ()가 아니라 $ (node) .parent (). children ()입니다. 좋은 기능 일 수도 있지만 성 가실 수도 있습니다. 그것은 당신이 원하는 것에 달려 있습니다.
cletus

1
node.parentNode.childNodes로 ELEMENT_NODE 노드를 확인하고 싶을 것입니다. 공백 텍스트 노드도 제공하기 때문입니다.
seanmonstar

아무것도, 나는 그것이 바보
같았다

100
var sibling = node.nextSibling;

이것은 바로 뒤에 형제를 반환하거나 더 이상 형제를 사용할 수없는 null을 반환합니다. 마찬가지로 다음을 사용할 수 있습니다.previousSibling .

[편집] 다시 생각하면 이것은 다음 div태그를 제공하지 않고 노드 뒤에 공백을 제공합니다. 더 나은 것 같습니다

var sibling = node.nextElementSibling;

또한 존재한다 previousElementSibling.


1
다음 / previousElementSibling는 IE8에서 지원되지 않습니다
바딤

1
IE9부터는 그렇습니다. 참조 stackoverflow.com/questions/5197825/…
parvus

14

빨리:

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

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

부모의 자식을 배열로 가져오고이 요소를 필터링합니다.

편집하다:

텍스트 노드를 필터링하려면 ( pmrotule 에게 감사 드립니다 ) :

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

2
좋은 솔루션입니다. 비록 나는 폐기 텍스트 노드의 nodeType를 확인할 것[ ...n.parentNode.children ].filter(c => c.nodeType == 1 && c != n)
pmrotule

타이프 스크립트를 어떻게 수정 하시겠습니까?
Nic Scozzaro

10

2017 년부터 :
간단한 대답 : element.nextElementSibling올바른 요소 형제를 얻기 위해. 또한 당신은 element.previousElementSibling이전 것

여기에서 모든 다음 치찰음을 얻는 것은 매우 간단합니다.

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

next또는 뿐만 아니라 모든 형제를 반환해야합니다 previous. 이 경우 정확히 뒤로 또는 앞으로 이동하도록 지정하는 것은 큰 도움이되지 않습니다.
dvlden

4
왜 안돼. 다음과 이전을 찍으면 전체 사진을 얻을 수 있습니다. 그 답은 일을하는 새로운 방법을 보여주기위한 것입니다. 독자들에게 무언가를 제공합니다. 부모로 이동하여 각 요소로 이동하여 모두가 할 수있는 현재 요소를 필터링합니다.
pery

6

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 노드인지 확인하고 n! == 현재 요소를 제외합니다.

동일한 기능을 사용할 수 있다고 생각합니다. 모든 코드는 바닐라 자바 ​​스크립트 인 것 같습니다.


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;
}

참고 : jQuery 코드 기반은 A 급 자바 스크립트를 관찰 할 수있는 훌륭한 리소스입니다.

다음은 매우 간소화 된 방식으로 jQuery 코드 기반을 보여주는 훌륭한 도구입니다. http://james.padolsey.com/jquery/


3

다음은 이전, 다음 및 모든 형제 (양쪽)를 얻는 방법입니다.

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);
}

2

사용 document.querySelectorAll ()루프와 반복

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

jQuery

$el.siblings();

기본-최신, Edge13 +

[...el.parentNode.children].filter((child) =>
  child !== el
);

네이티브 (대체)-최신, Edge13 +

Array.from(el.parentNode.children).filter((child) =>
  child !== el
);

기본-IE10 이상

Array.prototype.filter.call(el.parentNode.children, (child) =>
  child !== el
);


0

1) 선택한 클래스를 대상 요소에 추가
2) 대상 요소를 제외한 부모 요소의 모든 자식 찾기
3) 대상 요소에서 클래스 제거

 <div id = "outer">
            <div class="item" id="inner1">Div 1 </div>
            <div class="item" id="inner2">Div 2 </div>
            <div class="item" id="inner3">Div 3 </div>
            <div class="item" id="inner4">Div 4 </div>
           </div>



function getSiblings(target) {
    target.classList.add('selected');
    let siblings = document.querySelecttorAll('#outer .item:not(.currentlySelected)')
    target.classList.remove('selected'); 
return siblings
    }

-1

다음 함수는 주어진 요소의 모든 형제를 포함하는 배열을 반환합니다.

function getSiblings(elem) {
    return [...elem.parentNode.children].filter(item => item !== elem);
}

선택한 요소를 getSiblings()유일한 매개 변수이므로 함수에 전달하기 만하면 됩니다.


-2
x1 = document.getElementById('outer')[0]
      .getElementsByTagName('ul')[1]
      .getElementsByTagName('li')[2];
x1.setAttribute("id", "buyOnlineLocationFix");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.