프론트엔드 개발/JavaScript

이벤트 버블링 (자식 태그의 이벤트가 부모 태그까지 적용될 때)

Ella Seon 2023. 1. 31. 10:23

0. 문제 원인

- 리액트 블로그 프로젝트 중 자식 태그인 Delete 버튼만 눌렀을 뿐인데 부모태그에 적용된 onClick 이벤트가 같이 발생했다. Delete 버튼을 눌렀을 때 Delete 버튼에 적용된 onClick 이벤트인 콘솔창에 '버튼삭제'  글자만 띄우고 싶었는데

그 부모태그인 edit 페이지로 이동하는 이벤트까지 작용되었다.

 

1. 왜 자식태그를 눌렀는데 부모태그까지 적용돼? 이벤트 버블링

 

<이벤트 버블링 예시>

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>이벤트 버블링</title>
    <style>
      .parent {
        width: 200px;
        height: 200px;
        background-color: blue;
      }
      .child {
        width: 100px;
        height: 100px;
        background: yellow;
      }
    </style>
  </head>
  <body onclick="body1()">
    <div class="parent" onclick="parent()">
      <div class="child" onclick="child()"></div>
    </div>
    <script>
      function body1() {
        console.log("body");
      }
      function parent() {
        console.log("parent");
      }

      function child() {
        console.log("child");
      }
    </script>
  </body>
</html>

 

아래 gif 를 보면 

나는 body 부분을 클릭했을때는 콘솔창에 body 만 나온다.

헌데, parent 부분을 클릭하면 parent, body가 같이뜨고

child 부분을 클릭하면 child,parent,body 까지 같이 콘솔창에 뜬다.

 

왜 자식 태그만 눌렀는데 부모태그까지 이벤트가 영향을 미치지??

child를 클릭했을 때 parent 부분에 이벤트가 없다면 parent부분은 스킵하고  child, body만 콘솔창에 뜬다.

왜 이런일이 발생하는걸까?

 

2. 이벤트 버블링 뜻

이벤트가 하위요소에서 상위 요소 방향으로 전파 되는 것

3. 이벤트 버블링 막는 법, event.stoppropagation() 

event.stoppropagation()  : 이벤트가 상위 엘리먼트에 전달되지 않게 막아 준다.

 

가장 맨 아래 자식태그에 event.stoppropagation을 적용시키다.

 

그러면 더이상 이벤트 전파가 되지않는다.

즉, child 를 눌렀을 때 콘솔창에 child 만 표시된다.