본문 바로가기
Languages

[JavaScript] 이벤트 전파(Event flow)

by roses16 2023. 7. 2.

HTML은 여러 요소들이 중첩되어 쌓여있다.

<html>
    HTML
    <body>
        BODY
        <div>
            DIV
        </div>
    </body>
</html>

때문에 위 태그<html>, <body>, <div> 에 모두 onClick Event를 설정해둔 채로 div를 클릭했을때, HTML은 중첩된 3개의 요소들 중 우리가 실행을 원하는 것이 어떤 onClick 함수인지 판단이 어려워진다. 그래서 중첩된 요소들의 onClick 함수를 모두 실행한다.

 

이 때 onClick 함수가 호출되는 순서는 아래와 같이 Capture phase와 Bubble phase 두 가지로 나누어진다.

 

위 이미지에서 Target은 직접 클릭이 발생한 최상위 요소를 가리킨다. 이벤트가 발생하면 event.target.nodeName으로 해당 요소를 확인할 수 있다.
Current target은 본인 요소를 말한다. 이벤트가 호출되었을 때 this.nodeName으로 확인할 수 있다.

 

addEventListener는 Target과 Current target이 다른 요소들에게 (예제에서는 BODY와 HTML이 해당한다.) Capture phase에서 실행될지, Bubble phase에서 실행될지 직접 선택할 수 있게 한다.

 

addEventListener('click', function(event){}, ___Boolean___)

addEventListener의 세 번째 인자로 True가 입력될 경우 Capture phase에서, False가 입력될 경우 Bubble phase에서 실행된다. Default는 False이다.

 

이벤트 전파를 제어하는 함수

  • event.stopPropagation() : 실행 이후의 Propagation을 막는다. 단, 같은 대상의 다른 Event listener까지 막지는 않는다.
  • event.stopImmediateProgation() :같은 이벤트에 대해 다른 Event listener를 모두 멈춘다. 같은 대상의 다른 Event listener까지도 막는다.

🙏 참조

  • https://www.youtube.com/watch?v=7gKtNC3b_S8