

💡 이벤트 전파 3단계
- 캡처링 단계: 이벤트가 상위에서 하위 요소로 전파
- 타깃 단계: 이벤트가 이벤트 타깃에 도달
- 버블링 단계: 이벤트가 하위에서 상위 요소로 전파
이벤트는 캡처링 - 타깃 - 버블링 순으로 전판한다.
<body>
<ul id="fruits">
<li id="apple">apple</li>
<li id="banana">banana</li>
<li id="kiwi">kiwi</li>
</ul>
<script>
const $fruits = document.getElementById("fruits");
const $banana = document.getElementById("banana");
// ul태그 하위 요소인 li 요소를 클릭했을 때
$fruits.addEventListener("click", e => {
console.log(e.eventPhase); // 이벤트 단계 3 (버블링단계)
console.log(e.target); // 이벤트 타깃 *[object HTMLLIElement]*
console.log(e.currentTarget); // 커렌트 타깃 *[object HTMLULElement]*
});
$banana.addEventListener("click", e => {
console.log(e.eventPhase); // 이벤트 단계 2 (타깃 단계)
console.log(e.target); // 이벤트 타깃 *[object HTMLLIElement]*
console.log(e.currentTarget); // 커렌트 타깃 *[object HTMLLIElement]*
});
$fruits.addEventListener("click", e => {
console.log(e.eventPhase); // 이벤트 단계 1 (캡처링단계)
console.log(e.target); // 이벤트 타깃 *[object HTMLLIElement]*
console.log(e.currentTarget); // 커렌트 타깃 *[object HTMLULElement]*
}, true);
</script>
</body>
이와 같이 이벤트는 이벤트를 발생시킨 이벤트 타깃은 물론 상위 DOM요소에서도 캐치할 수 있다.
💡 event.target 와 event.currentTarget
event.target
실제로 이벤트를 발생시킨 DOM 요소event.currentTarget
이벤트 핸들러가 바인딩된 DOM 요소EventTarget.addEventListener('eventType', functionName [, useCapture])addEventListener방식으로 이벤트를 등록할 때EventTarget이 곧event.currentTarget이 된다.event.target와event.currentTarget은 버블링/캡처링 과정에 따라 서로 다를 수 있다.
addEventListener 메서드 방식은 3번째 인자로 true 를 전달하면 캡처링 단계도 캐치할 수 있다. 3번째 인자로 false 를 전달하거나 생략하면 타깃 단계와 버블링 단계만 캐치할 수 있다.function handleClick({ target }) {
[...$fruits.children].forEach($fruit => {
// 로직 처리
});
}
document.getElementById("apple").onclick = handleClick;
document.getElementById("banana").onclick = handleClick;
document.getElementById("kiwi").onclick = handleClick;
function handleClick({ target }) {
*// 이벤트를 발생시킨 요소가 #fruits > li 자식 요소가 아니면 무시*
if (!target.matches('#fruits > li')) return;
[...$fruits.children].forEach($fruit => {
// 로직 처리
});
}
$fruits.onclick = handleClick;
stopPropagation 메서드 이용