html 에서 getElementByClassName() 으로 요소를 가져왔는데
addEventListener is not a function Error 라는 에러가 떴다.
아래는 문제의 코드.
getElementsByClassName() 를 사용해서 가져온 요소는 배열이다.
1) 그래서 getElementsByClassName() 로 가져온 요소에 addEventListenr 를 추가하려면 배열[index] 표시를 아래와 같이 해주거나,
const boxes = document.getElementsByClassName('box');
console.log(boxes); // 👉️ [div.box, div.box, div.box]
// ✅ addEventListener to first box
boxes[0].addEventListener('click', function onClick() {
console.log('box clicked');
});
// ✅ addEventListener to all boxes
for (const box of boxes) {
box.addEventListener('click', function onClick() {
console.log('box clicked');
});
}
(코드 출처)
2) querySelector()를 이용한다. getElementsByClassName()은 오류 나면서 querySelector()가 되는 이유는, getElementsByClassName() 는 배열을 반환하지만, querySelector()는 요소 하나만을 반환하기 때문이다.
getElementsByClassName 의 반환값은 정확하게는 배열은 아니고 유사배열객체(HTMLCollection)입니다 😄
유사배열객체도 iterator-iterable 프로토콜을 구현하고 있기 때문에 for-of 문이나 전개연산자가 사용가능하지만,
HTMLCollection 은 forEach 등의 Array.prototype의 메서드는 구현하고 있지 않기 때문에 배열과는 차이점이 있어요 👍🏻
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName#return_value