Event Bubbling : 중첩된 요소에서 동일한 이벤트를 가지면 하위 요소에서 상위 요소로 이벤트를 전달하는 현상
Event Capturing : 중첩된 요소에서 동일한 이벤트를 가지면 상위 요소에서 하위 요소로 이벤트를 전달하는 현상
기본적으로 브라우저는 capturing으로 시작해서 이벤트가 발생한 target까지 내려가면 다시 bubbling으로 올라간다
addEventListener의 3번째 인자에 true 지정시 capturing을 통해 이벤트 전파, false 지정시 bubbling으로만 이벤트 전파 (default : false)
/*HTML*/
<section class="container">
<div class="outer">
<button class="middle">Click Me</button>
</div>
</section>
/*JavaScript*/
const container = document.querySelector('.container');
const outer = document.querySelector('.outer');
const inner = document.querySelector('.inner');
container.addEventListener('click', (e) => {
console.log(`container: ${e.currentTarget}, ${e.target}`);
});
outer.addEventListener('click', (e) => {
console.log(`outer: ${e.currentTarget}, ${e.target}`);});
inner.addEventListener('click', (e) => {
console.log(`inner: ${e.currentTarget}, ${e.target}`);});
첫번째 코드 결과값
container: [object HTMLElement], [object HTMLElement]
e.currentTarget ?
e.target ?
두번째 코드 결과값
outer: [object HTMLDivElement], [object HTMLDivElement]
container: [object HTMLElement], [object HTMLDivElement]
e.currentTarget ?
e.target ?
세번째 코드 결과값
inner: [object HTMLButtonElement], [object HTMLButtonElement]
outer: [object HTMLDivElement], [object HTMLButtonElement]
container: [object HTMLElement], [object HTMLButtonElement]
세번째 코드는 inner, outer, container 3개의 결과값이 나왔다
이렇게 나온 이유 역시 Bubbling
떄문이다
Bubbling ?
동일한 이벤트를 가질 때 해당 이벤트가 하위 요소에서 상위 요소로 전달 되는 것
즉 위의 코드에서 HTML 구조는 session <- div <- button의 DOM Tree를 가진다
쉽게 말해 위의 코드에서는 모두 click이라는 동일한 이벤트를 가지고있고 제일 하위요소인 button을 클릭했을 때 button에만 click 이벤트가 발생하는게 아닌 동일한 이벤트를 가진 상위요소인 div에도 동일한 이벤트가 발생하고 또 div와 동일한 이벤트를 가진 상위요소인 section에도 동일한 이벤트가 발생하는 현상을 Bubbling
이라고 한다
그래서 button을 클릭 했을 때 버블링에 의해 결과값이 3개가 나왔고 div를 클릭 했을 때는 동일한 이벤트를 가진 상위요소가 section밖에 없었기 때문에 결과값이 2개가 나온 것이다 (동일한 event를 가지고 있을 때만 발생)
😍 DOM Tree에 대한 자세한 설명은 제 벨로그에 있습니다 😍
Capturing
event.stopPropagation()
Event.stopImmediatePropagation()
이벤트 전파도 막고 다음 단계의 요소들이 개별적으로 가지고 있는 어떠한 이벤트 핸들러의 실행도 막는다 (다른 요소들의 이벤트는 전부 취소하고 본인의 이벤트만 실행)
위의 코드를 남용하는 사람들이 생각보다 많은데 정말 안좋은 습관이다
Why ?
사용자 입장에서 다음 단계에 더 의미 있는 이벤트가 있을수도 있는데 강제로 중단 시키는것은 좋지 않다 (버그 발생의 주 원인)😍 코드 지적은 언제나 환영입니다. 읽어주셔서 감사합니다. 😍