자식요소에서 발생된 이벤트는 부모를 통해 전파가 된다.
즉 하위 요소에서 상위 요소로 올라가게 된다.
<body> <div id ="box"> <ul id = "list"> <li id ="color"> red </li> </ul> </div> </body>
body
-> div
-> ul
-> li
태그들이 부모와 자식 관계를 가지고 있다.
다음과 같이 각 요소가 클릭이 되었을 때 콘솔 로그를 출력해보자.
<script> const div = document.querySelector('div'); const ul = document.querySelector('ul'); const li = document.querySelector('li'); document.body.addEventListener('click', () => { console.log("1 body") }); div.addEventListener('click', () => { console.log("2 div") }); ul.addEventListener('click', () => { console.log("3 ul") }); li.addEventListener('click', () => { console.log("4 li") }); </script>
li
을 클릭했을 땐 콘솔에 어떤 값이 출력될까?
위 그림에서 빨간 박스는 li
이 가진 스타일이다.
그럼 빨간색 박스를 클릭했을 때, 콘솔에 찍힌 값을 보자.
li
만 찍혔는가?
li
의 부모 태그까지 모두 찍힌 것을 확인 할 수있다.
동일하게 ul
을 클릭한다면 다음과 같이 li
를 제외한 body
태그까지의 부모 태그가 출력된다.
이 과정을 이벤트 버블링이라고 한다.
그림으로 표현하자면 아래와 같다.
대부분의 이벤트는 위와 같이 버블링이 작동된다.
하지만 다음의 이벤트는 버블링이 발생하지 않는다.
- focus
- blur
- mouseenter
- mouseleave
위 이벤트를 버블링으로 작동하게 하기 위해서는 아래와 같이 변경해 사용하면된다.
이들은 같은 동작을 수행하지만 버블링의 작동 유무에 차이점이 있으므로 적절하게 사용하도록 하자.
- focus => focusin
- blur => focusout
- mouseenter => mouseover
- mouseleave => mouseout