inflearn logo
강의

Course

Instructor

First Steps in JavaScript for Web Frontend

DOM API-1

getElementsByClassName 리턴값 질문

Resolved

766

HK

15 asked

1

 

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

javascript dom

Answer 2

1

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

0

HK

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

1

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

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

1

hyobin

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

 

1

HK

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

브라우져 호환성 문의

0

67

2

4-23 Promise객체 12:05 코드 질문

0

60

2

<div class="bookmark-item-add-btn"> 질문

0

58

2

랜덤이미지

0

58

2

"6. 1. (최신 버전) 자바스크립트 코딩 환경 설정"의 화면이 정상적으로 출력되지 않습니다

1

72

2

북마크바 디폴트가 "북마크 열기"로 뜹니다.

1

130

1

홈페이지 이미지 추가 방법 문의드립니다!

0

114

2

북마크 추가 버튼 활성화 오류 문의드립니다!

0

113

1

북마크바 배치 문의드립니다!

0

113

2

명언 설정하는데 위치설정 오류가 있어요!

0

143

2

4:45 부터 무한로딩되어 재생이 안됩니다ㅠ

1

105

1

BigInt Type 에 대하여

0

86

1

계속 헷갈리네요. 이게 맞나요?

1

148

2

섹션 7 - 7 프로젝트 적용하기

1

120

2

섹션7 - 7 프로젝트 적용하기

0

88

1

섹션7-4 api사용해서 명언 설정하기

0

134

2

6분 53초 질문입니당

1

119

2

왜 전부다 div태그로 만드는지 궁금합니다.

1

231

2

[수업질문] bookmark.js에서

0

128

2

최종 프로젝트 적용

0

181

2

append&appendChild+메소드 호출

1

136

1

코드샌드박스 업데이트

0

165

2

async pending상태의 promise객체

1

149

2

화면이 다릅니다.

1

176

1