이벤트가 제일 깊은 곳에 있는 요소에서 시작해 부모 요소를 거슬러 올라가며 발생하는 모양이 마치 물속 BUBBLE과 닮았기 때문에 버블링이라는 이름이 붙여짐
<style>
body * {
margin: 10px;
border: 1px solid blue;
}
</style>
<form onclick="alert('form')">FORM
<div onclick="alert('div')">DIV
<p onclick="alert('p')">P</p>
</div>
</form>
<순서>
<p>
에 할당된onclick
핸들러 동작
바깥의
<div>
에 할당된 핸들러 동작
그 바깥의
<form>
에 할당된 핸들러 동작
✔️ 거의 모든 이벤트는 버블링됨 예외: `focus`
document
객체를 만날 때까지,onclick
핸들러 동작
form.onclick
하나밖에 없지만 이 핸들러에서 폼 안의 모든 요소에서 발생하는 클릭 이벤트를 ‘잡아냄(catch)’→ 클릭 이벤트가 어디서 발생했든 상관없이 <form>
요소까지 이벤트가 버블링 되어 핸들러를 실행시키기 때문
💡 `event.target`은 실제 이벤트가 시작된 ‘타깃’ 요소입니다. 버블링이 진행되어도 변하지 않습니다.
form.onclick
핸들러 내의this
와event.target
의 차이
this
(event.currentTarget
) –<form>
요소에 있는 핸들러가 동작했기 때문에<form>
요소를 가리킴event.target
– 폼 안쪽에 실제 클릭한 요소를 가리킴.
this
는 ‘현재’ 요소로, 현재 실행 중인 핸들러가 할당된 요소를 참조합니다.
event.stopPropagation()
<body onclick="alert(`버블링은 여기까지 도달하지 못합니다.`)">
<button onclick="event.stopPropagation()">클릭해 주세요.</button>
</body>
→ event.stopImmediatePropagation()