A에 A 전용 클릭 이벤트 달고, B에 B 전용 클릭 이벤트를 달아놓은 상태였다. (A 이벤트와 B 이벤트는 독립적이다.)
문제는 B에서 클릭 이벤트가 발생할 때, A에 걸어놓은 이벤트도 같이 실행됐다.
이벤트 버블링 때문에 A 이벤트도 실행된 것처럼 보였다.
DOM 트리 상에 존재하는 DOM 요소 노드에서 발생한 이벤트는 DOM 트리를 통해 전파된다.
다만 이벤트가 무작정 전파되는 것은 아니다. 부모-자식 간 관계만 전파된다.
이벤트가 전파되는 방향에 따라 3단계로 구분할 수 있다.
c 영역을 누르면 c > b > a 가 찍히는걸 볼 수 있다.
이처럼 버블링은 이벤트가 아래에서 위로 전파된다.
브라우저의 이벤트는 기본적으로 버블링 방식으로 이벤트가 전파된다.
그럼 캡처링 설정은 어떻게 해?
이벤트 리스너 맨 끝에 아래와 같이 true 옵션만 설정하면 된다.
document.getElementById("d").addEventListener(
"click",
() => console.log("d"),
true
);
그리고 f 영역을 누르면 d > e > f 가 찍힌다.
캡처링을 사용해 볼 경우가 드물 것 같다는 생각이 들었다.
본론으로 돌아와서 나는 B 이벤트가 발생할 때, A 이벤트도 발생하지 않길 원했다.
<div onClick={(e) => {
e.stopPropagation();
// do something
}}>
그래서 그냥 단순하게 이벤트 전파를 막고자 하는 부분에 stopPropagation
을 달았다.
근데 stopPropagation
을 사용한 부분은 죽은 영역으로 판단해서 행동 패턴 분석을 위한
분석 시스템이 인식하지 못하는 상황이 생긴다는 블로그를 봤다.
죽은영역으로 판단한다는게 아직 잘 안와닿아서 나중에 찾아봐야될거같다.
https://letsgojieun.tistory.com/53
그래서 e.target
과 e.currentTarget
이 같은지 아닌지로 이벤트 전파를 막으신 듯 하다.