<body>
<div class="one">one
<div class="two">two
<div class="three">three
</div>
</div>
</div>
</body>
const divs = document.querySelectorAll('div')
const logEvent = ()=>{
console.log(event.currentTarget.className);
}
divs.forEach((v)=>v.addEventListener('click', logEvent))

divs.forEach((v)=>v.addEventListener('click', logEvent, {capture:true}))

➡️ three 요소를 클릭했더니 버블링 현상과 반대로 출력되었다.
const logEvent = ()=>{
event.stopPropagation();
console.log(event.currentTarget.className);
}
➡️ event 객체의 stopPropagation 메소드를 활용하면 전파를 막아주고, 이벤트가 발생한 요소만 실행이 된다. 단, 캡처링은 이벤트를 발생시킨 요소가 아닌 최상위 요소가 동작하게 된다.
<h1>TO DO LIST</h1>
<ul class="itemList">
<li>
<input type="checkbox" id="item1">
<label for="item1">코드잇 강의 수강</label>
</li>
<li>
<input type="checkbox" id="item2">
<label for="item2">코드잇 과제</label>
</li>
</ul>
const inputs = document.querySelectorAll('input');
const logEvent = ()=>{
alert('clicked')
}
inputs.forEach((v)=>v.addEventListener('click', logEvent))

➡️위 체크 박스를 클릭하면 'checked' 문구의 alert 창이 뜨게 된다. 여기서 자바스크립트 코드로 li 요소를 추가해도 적용이 될까? 결론은 안 된다. input에 이벤트 리스너를 등록하는 시기에는 2개의 li 밖에 없었기 때문에 추가를 한다고 하더라도 기존의 li만 정상 작동하게된다.
그럼 새로 추가해야 하는 li 요소들에 이벤트 핸들러를 매번 등록해 줘야 할까? 이때 이벤트 위임 개념을 적용할 수가 있다.
const logEvent = ()=>{
alert('clicked')
}
const itemList = document.querySelector('.itemList');
itemList.addEventListener('click', logEvent);
➡️ ul 태그를 선택하여 이벤트 리스너를 등록한 코드이다. 이벤트 위임이 동작함에 따라 ul 태그의 하위 요소로 어떤 li태그가 추가가 되든 logEvent 함수가 실행되는 것을 확인할 수 있다.
