

div 를 클릭하면, div 는 이벤트의 시발점이 된다.

그렇지만, 내가 div를 눌렀는데, div 만 눌렀다고 보기에는 조금.. 애매하다.
div 를 클릭한 것인가div 밑에있는 body 를 클릭한 것인가html 을 클릭한 것인가→ 그래서 만약에 이 부모들(body, html) 에게도 똑같이 클릭이벤트가 있다면, 이것들도 다같이 실행시켜버린다.
👏🏻 그럼 결국 이 이벤트의 진짜 원인이 되는 것은 div 이고, 부모들은 이 이벤트를 탑승하게 되는거다.
물론 부모에게 클릭이벤트가 없으면 아무상관없는거다! 🙂
currentTarget 이랑 target 의 개념은 분리해서 이해해야 한다.
이벤트가 실행 됐을 때의 진짜주인
그래서 이 이벤트가 누구때문에 실행이 된건지
div 입장
→ div 입장에서는 div 에서 발생한 그 이벤트(div click) 의 주인은 자기 자신에게 있는 이벤트이다.
→ 그래서 target 도 div 가 된다.
body 입장
→ body 입장에서는 body 안에있는 eventHandler 가 실행이 되기때문에 그 이벤트의 주인은 자기 자신이기 때문에 currentTarget 은 body 가 되는거다.
→ 하지만 이 이벤트는 누구때문에 실행이 된거냐면 div 때문이다.
html 입장
→ html 입장에서도 마찬가지이다.
→ html 은 html 에 있는 eventHandler 가 실행이 되고, 그 eventHandler 의 주인(currentTarget) 은 html 인거지만,
→ 이게 누구때문에 실행이 된건가는 div 때문에 실행이 된거다.
👏🏻 그래서 currentTarget 과 target 을 분리해서 생각해야한다!
이벤트는 흐름이고 그 흐름의 순서는 각각 다음과 같다.
1. Capture phase
2. Target phase
3. Bubble phase
✨ 이벤트에는 실행이되는 flow가 정해져있다.

html 밑에는 window (broswer) 가 있고 그 브라우저에서부터 가장 가까운 요소부터 이벤트가 시작이 되는데, 이 과정을 capture phase 라고 한다. (가장 아래에서부터! 올라간다!)

그리고 그 이벤트가 진짜 시작된 당사자이벤트가 실행이 되는것을 target phase 라고 한다.

그리고 이벤트는 흐름인거니까 다시 또 내려간다. 그래서 부모 → 다시 부모 → .. 이렇게 내려오는 과정을 bubble phase 라고 한다.
이렇게 이벤트가 흐름으로 도는 과정에서, 이벤트가 계속 중복으로 발생되는 문제가 생긴다. div 하나 눌렀을 뿐인데, 관련된 요소들이 모두 이렇게 실행이 되어버리면,, 🤦🏻♀️

👏🏻 그래서 브라우저는 제약을 둔다!
currentTarget 과 target이 일치하지 않는 경우 capture 단계에서 이벤트가 발생될 지 bubble 단계에서 이벤트가 발생될지를 선택할 수 있게 해준다.
bubble 이다. ✨


div 를 클릭하게되면
capture phase 단계
→ capture phase 가 시작이 되고,
→ capture phase 가 html 에게 묻는다.
"capture phase 때 실행될거야? bubble phase 때 실행될거야?"
→ html 은 capture phase 때니까, 이번에 실행이 된다.
→ body 는 bubble phase 일 때 실행되겠다고 하니까 이번에 실행 안시킨다.
→ 그 다음에 target 으로 가니까 div 가 실행이 되고, 다시 내려간다.
Bubble phase 단계
→ body 는 아까 bubble 때 실행한고 했으니까 이제 실행이 되고
→ html 은 capture 때 실행한다고 했으니까 이 단계에서는 실행될 필요가 없다.

DIV
BODY
HTML

BODY
DIV
HTML