반응형
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
li에 클릭했을 때 행동을 제어하고 싶다면, document.querySelectorAll로 li 배열을 가져와서 foreach같은 걸로 순환하며 addEventListener를 등록할텐데 이렇게 하면 li 개수만큼 이벤트리스너가 등록되기때문에 효율적이지 못함. 게다가 등록한 리스너를 삭제해야하는 상황이 온다면 또 배열 돌리고 어쩌고... 손가락 아픔.
이럴때는 아예 부모인 ul에 addEventListener를 등록해서 조건을 거는 방법이 있음.
document.querySelector("ul").addEventListener("click", function(event) {
if (event.target.nodeName != "LI") return;
// 이제 li를 클릭했을때만 액션 발생
});
관련 내용은 각종 블로그나 프롱트님 영상 추천.
근데 여기서 tagName과 nodeName 두가지 방법이 있는데 이참에 두 차이가 뭔지 한번 찾아봄.
1. 차이점
<button class="btn">다시보기</button>
이렇게 한 element가 있고, 저걸 변수로 받아서 찍어보자면 tagName과 nodeName은 똑같이 BUTTON임.
그렇다면 무슨 차이냐 할텐데 tagName은 nodetype이 1인 element의 이름을 가져옴.
DOM에서 읽을 수 있는 각각의 아이템(?)을 node라고 하는데 <p>, <div>, <h1> 이런게 전부 타입 1에 해당함. 그냥 element라 생각하면 된다.
nodeName은 nodetype에 제한이 없음. 코드로 정리하면 다음과 같음
const a = document.querySelector("button");
a.tagName; // BUTTON
a.nodeName; // BUTTON
const b = a.firstChild; // 이경우 안에 든 텍스트만 가리킴
b.tagName; // undefined
b.nodeName; // "#text"
const c = a.getAttributeNode("class");
c.tagName; // undefined
c.nodeName; // "btn"
뭐 IE 어떤 버전은 nodeName 지원안하고 어쩌고 그런 내용이 있지만 이제 가신 분이기때문에 결론 nodeName 써라.
'Javascript' 카테고리의 다른 글
[vscode] 간편한 snippet 등록하기 (0) | 2024.02.01 |
---|---|
contains과 matches 차이점 (0) | 2023.11.24 |
input창 글자수 넘으면 자동으로 삭제하기, 숫자만 쓰기 (1) | 2023.10.26 |
append 관련 오류. The new child element contains the parent. (0) | 2023.10.24 |
input file의 url 받아 처리하기 + 팁 (0) | 2023.10.23 |