December 1, 2021
먼저 예시부터 살펴봅시다.
아래 핸들러는 <div>
에 할당되어 있지만, <em>
이나 <code>
같은 중첩 태그를 클릭해도 동작합니다.
버블링(bubbling)의 원리는 간단합니다.
한 요소에 이벤트가 발생하면, 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작합니다. 가장 최상단의 조상 요소를 만날 때까지 이 과정이 반복되면서 요소 각각에 할당된 핸들러가 동작합니다.
3개의 요소가 FORM > DIV > P
형태로 중첩된 구조를 살펴봅시다. 요소 각각에 핸들러가 할당되어 있습니다.
부모 요소의 핸들러는 이벤트가 정확히 어디서 발생했는지 등에 대한 자세한 정보를 얻을 수 있습니다.
이벤트가 발생한 가장 안쪽의 요소는 타깃(target) 요소라고 불리고, event.target
을 사용해 접근할 수 있습니다.
event.target
과 this
(=event.currentTarget
)는 다음과 같은 차이점이 있습니다.
event.target
은 실제 이벤트가 시작된 ‘타깃’ 요소입니다. 버블링이 진행되어도 변하지 않습니다.this
는 ‘현재’ 요소로, 현재 실행 중인 핸들러가 할당된 요소를 참조합니다.이벤트 버블링은 타깃 이벤트에서 시작해서 <html>
요소를 거쳐 document
객체를 만날 때까지 각 노드에서 모두 발생합니다. 몇몇 이벤트는 window
객체까지 거슬러 올라가기도 합니다. 이 때도 모든 핸들러가 호출됩니다.
그런데 핸들러에게 이벤트를 완전히 처리하고 난 후 버블링을 중단하도록 명령할 수도 있습니다.
이벤트 객체의 메서드인 event.stopPropagation()
를 사용하면 됩니다.
아래 예시에서 <button>
을 클릭해도 body.onclick
은 동작하지 않습니다.