본문 바로가기

programming/Javascript

이벤트 버블링과 캡처링

캡처링과 버블링을 간단히 정의하면 다음과 같다.

 

  • 캡처링 - window 로부터 이벤트가 발생한 요소까지 이벤트를 전파한다.
  • 버블링 - 이벤트가 발생한 요소부터 window 까지 이벤트를 전파한다.

 

버블링

 

버블링과 캡처링

 

ko.javascript.info

버블링(bubbling)의 원리는 간단합니다.

한 요소에 이벤트가 발생하면, 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작합니다. 가장 최상단의 조상 요소를 만날 때까지 이 과정이 반복되면서 요소 각각에 할당된 핸들러가 동작합니다.

3개의 요소가 FORM > DIV > P 형태로 중첩된 구조를 살펴봅시다. 요소 각각에 핸들러가 할당되어 있습니다.

 

사례)

테이블의 경우에 테이블 전체(event.currentTarget)에 이벤트를 걸고 내부의 td(evnet.target)를 클릭해도 이벤트가 동작하게 할 수 있다.

 

 

버블링 중단하기

이벤트 버블링은 타깃 이벤트에서 시작해서 <html> 요소를 거쳐 document 객체를 만날 때까지 각 노드에서 모두 발생합니다. 몇몇 이벤트는 window 객체까지 거슬러 올라가기도 합니다. 이 때도 모든 핸들러가 호출됩니다.

그런데 핸들러에게 이벤트를 완전히 처리하고 난 후 버블링을 중단하도록 명령할 수도 있습니다.

이벤트 객체의 메서드인 event.stopPropagation()를 사용하면 됩니다.

아래 예시에서 <button>을 클릭해도 body.onclick은 동작하지 않습니다.

 

 

둘의 차이점은 단순히 방향이다.

하위 => 상위, 상위 => 하위 개념으로 보면 된다.

위의 예제의 경우는 버블링이라고 볼 수 있다.

WC3 에서 명시한 스펙의 그림을 보면 쉽게 이해할 수 있다.



 

 

제어방법

캡처링

addEventListener 메소드 세번째 인자 useCapture값을 설정

 

버블링

단순히 e.stopPropagation() 메소드를 사용하면 된다.

뭐가 좋은가?

프로그램이 종료될때 removeEventListner 확실히 제거 에러방지