인프런 커뮤니티 질문&답변

HK님의 프로필 이미지
HK

작성한 질문수

웹 프론트엔드를 위한 자바스크립트 첫걸음

2. DOM API-1

getElementsByClassName 리턴값 질문

해결된 질문

작성

·

643

·

수정됨

1

 

querySelectorAll은 nodelist를 리턴값으로 받아서 Foreach로 선언해서 해당 dom을 event handling 한다고 배웠는데 getElementsByClassName도 querySelectorAll과 같이nodelist를 리턴 받아 forEach형태로 event handling을 할 수 있는 지 답변 부탁드립니다.

답변 2

1

효빈 Hyobin님의 프로필 이미지
효빈 Hyobin
지식공유자

안녕하세요 HK님
우선 좋은 질문 감사합니다!!

querySelectorAll은 NodeList를 반환하고 getElementsByClassName은 HtmlCollection을 반환합니다.
본 강의는 입문자용 강의이기 때문에 이 둘의 차이에 대해서는 깊게 다루지 않았는데요,

쉽게 설명하자면 HTMLCollection은 노드의 상태 변화를 실시간으로 감지하지만, NodeList는 노드를의 변경을 실시간으로 감지하지 않는다는 차이점이있습니다.

HTMLCollection은 item(), namedItem()이라는 두 가지 메서드를 제공하고, NodeList는 item(), forEach(), keys() 등의 여러가지 메서드들을 제공합니다.

querySelectorAll은 NodeList를 반환하기 때문에 forEach 메서드를 통해 요소들을 핸들링할 수 있고, getElementsByClassName은 HTMLCollection을 반환하기 때문에 forEach 메서드가 제공되지 않아 해당 메서드를 사용할 수 없습니다.

NodeList와 HTMLCollection에 대한 자세한 내용은 아래의 사이트를 참고하면 더 쉽게 이해하실 수 있을 것 같습니다 :)
- NodeList : https://developer.mozilla.org/ko/docs/Web/API/NodeList
- HTMLCollection : https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection

HK님의 프로필 이미지
HK
질문자

아하 dom event를 handling을 할때는 querySelectorAll을 이용해야 하는군요. 그러면 getElementsByClassName은 주로 어디서 사용하는지 답변 부탁드립니다.

효빈 Hyobin님의 프로필 이미지
효빈 Hyobin
지식공유자

getElementsByClassName은 HTMLCollection을 반환하고, HTMLCollection은 노드의 상태 변화를 실시간으로 감지하기 때문에, 이후에 추가되거나 변경된 노드들도 모두 감지합니다. 노드의 상태 변화를 실시간으로 감지하길 원하고 class이름으로 요소들을 찾고싶을때 주로getElementsByClassName을 사용합니다.

아래는 HTMLCollection과 NodeList의 차이를 볼 수 있는 예제 코드입니다.

const elm = document.getElementById("today-info");
const elm1 = document.getElementsByClassName("date"); //HTMLCollection
const elm2 = document.querySelectorAll("div.date"); //NodeList

console.log(elm1); //HTMLCollection은 아래에 추가된 새로운  div 감지 후 출력
console.log(elm2); //NodeList는 아래에 추가된 새로운 div를 감지하지 못함

const newElm = document.createElement("div");
newElm.classList.add("date");
elm.appendChild(newElm);

 

HTMLCollection은 forEach 메서드를 제공하지 않기 때문에 보통 배열로 변경 후 forEach메서드를 사용합니다.

const dateElm= document.getElementsByClassName("date");

Array.from(dateElm).forEach((elm) => {
  //HTMLCollection을 배열로 변경 후 forEach사용
  console.log(elm);
});

0

HK님의 프로필 이미지
HK
질문자

getElementsByClassName은 상태 변화를 실시간으로 감지 할수 있다고 말씀하셨는데, 만일 api데이터를 이용하여 동적으로 생성된 요소도 감지를 할 수 있을까요? 계속 질문을 드려서 죄송합니다.

효빈 Hyobin님의 프로필 이미지
효빈 Hyobin
지식공유자

네 만약 api를 호출해 받아온 데이터를 동일한 class 이름으로 바로 추가하게 된다면 추가된 요소들까지 바로 감지 할 수 있을 것 같습니다.

 

HK님의 프로필 이미지
HK
질문자

예제코드를 가지고 비교하면서 설명해주셔서 정말로 감사드립니다.

HK님의 프로필 이미지
HK

작성한 질문수

질문하기