JavaScript/DOM

[JavaScript]형제 노드 가져오는 방법

DevStory 2022. 11. 15.

형제 노드 가져오는 방법

이번 포스팅은 형제 노드를 가져오는 방법을 소개합니다.

 

먼저 형제 노드가 무엇인지 알아봅시다.

 

아래와 같은 HTML 마크업이 존재한다고 가정합시다.

<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
  </head>

  <body>
    <div id="parent" class="parent-class">
      <div id="child-1">child1</div>
      <div id="child-2">child2</div>
      <div id="child-3">child3</div>
      <div id="child-4">child4</div>
      <div id="child-5">child5</div>
    </div>

    <script src="src/index.js"></script>
  </body>
</html>

id가 child-3인 HTML 요소를 기준으로 형제 노드는 네 개입니다.

 

id가 child-3인 HTML 요소를 기준

- id가 parent인 HTML 요소는 부모 노드입니다.

- id가 child-1인 HTML 요소는 형제 노드입니다.

- id가 child-2인 HTML 요소는 형제 노드이면서 이전 노드입니다.

- id가 child-4인 HTML 요소는 형제 노드이면서 다음 노드입니다.

- id가 child-5인 HTML 요소는 형제 노드입니다.


이전 형제 노드 가져오는 방법

기준 노드를 접근한 다음 previousElementSibling 프로퍼티를 사용합니다. 만약 이전 노드가 없는 경우 null이 반환됩니다.

 

다음 예제는 id가 child-3인 HTML 요소의 이전 노드를 가져옵니다.

const currentNode = document.querySelector("#child-3");

console.log(currentNode.previousElementSibling);

[실행 결과]

기준 노드 이전의 모든 형제 노드를 가져오려면 이전 노드의 이전 노드를 접근하는 과정을 반복합니다. 기준 노드 이전의 모든 형제 노드를 가져오는 방법은 아래와 같습니다.

var currentNode = document.querySelector("#child-3");
var prevNode = currentNode.previousElementSibling;

while(prevNode) {
  console.log(prevNode);
  prevNode = prevNode.previousElementSibling;
}

[실행 결과]


다음 형제 노드 가져오는 방법

기준 노드를 접근한 다음 nextElementSibling 프로퍼티를 사용합니다. 만약 다음 노드가 없는 경우 null이 반환됩니다.

 

다음 예제는 id가 child-3인 HTML 요소의 다음 노드를 가져옵니다.

const currentNode = document.querySelector("#child-3");

console.log(currentNode.nextElementSibling);

[실행 결과]

기준 노드 다음의 모든 형제 노드를 가져오려면 다음 노드의 다음 노드를 접근하는 과정을 반복합니다. 기준 노드 다음의 모든 형제 노드를 가져오는 방법은 아래와 같습니다.

var currentNode = document.querySelector("#child-3");
var nextNode = currentNode.nextElementSibling;

while(nextNode) {
  console.log(nextNode);
  nextNode = nextNode.nextElementSibling;
}

[실행 결과]


모든 형제 노드 가져오는 방법

모든 형제 노드를 가져오는 방법은 다음과 같습니다.

1. 부모 노드를 가져옵니다.

2. 부모 노드의 첫 번째 자식 노드를 가져옵니다.

3. 배열에 첫 번째 자식 노드를 추가합니다.

4. 다음 형제 노드를 가져온 다음 배열에 추가하며 기존 노드인 경우 배열에 추가하는 과정을 생략합니다.

var currentNode = document.querySelector("#child-3");

function getSiblings(currentNode) {
  let slblings = [];

  // 부모 노드가 없는 경우 현재 노드를 반환
  if (!currentNode.parentNode) {
    return currentNode;
  }

  // 1. 부모 노드를 접근합니다.
  let parentNode = currentNode.parentNode;

  // 2. 부모 노드의 첫 번째 자식 노드를 가져옵니다.
  let silblingNode = parentNode.firstChild;

  while (silblingNode) {
    // 기존 노드가 아닌 경우 배열에 추가합니다.
    if (silblingNode.nodeType === 1 && silblingNode !== currentNode) {
      slblings.push(silblingNode);
    }
    // 다음 노드를 접근합니다.
    silblingNode = silblingNode.nextElementSibling;
  }

  // 형제 노드가 담긴 배열을 반환합니다.
  return slblings;
}

console.log(getSiblings(currentNode));

[실행 결과]


정리

  • previousElementSibling 프로퍼티는 현재 노드의 이전 노드를 반환하며 이전 노드가 존재하지 않으면 null을 반환합니다.
  • 현재 노드의 모든 이전 노드를 구하는 방법은 이전 노드의 이진 노드를 접근하는 과정을 반복하는 것입니다.
  • nextElementSibling 프로퍼티는 현재 노드의 다음 노드를 반환하며 다음 노드가 존재하지 않으면 null을 반환합니다.
  • 현재 노드의 모든 다음 노드를 구하는 방법은 다음 노드의 다음 노드를 접근하는 과정을 반복하는 것입니다.
반응형

댓글