getElementsByClassName 리턴값 질문
querySelectorAll은 nodelist를 리턴값으로 받아서 Foreach로 선언해서 해당 dom을 event handling 한다고 배웠는데 getElementsByClassName도 querySelectorAll과 같이nodelist를 리턴 받아 forEach형태로 event handling을 할 수 있는 지 답변 부탁드립니다.
Answer 2
1
안녕하세요 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
아하 dom event를 handling을 할때는 querySelectorAll을 이용해야 하는군요. 그러면 getElementsByClassName은 주로 어디서 사용하는지 답변 부탁드립니다.
1
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
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

