[JavaScript] preventDefault() 와 stopPropagation()

2025. 2. 15. 20:00·Frondend/JavaScript

preventDefault() 와 stopPropagation()이란? 

JavaScript에서 이벤트를 다룰 때, 기본 동작을 막거나 이벤트의 전파를 차단해야 하는 경우가 있습니다. 이를 위해 preventDefault() 와 stopPropagation() 메서드를 사용할 수 있습니다. 

  • preventDefault(): 기본 동작(폼 제출, 링크 이동 등)을 차단
  • stopPropagation(): 이벤트가 부모 요소로 전파(버블링)되는 것을 방지

이 두 가지는 완전히 다른 역할을 하므로, 상황에 맞게 적절히 사용해야 합니다. 아래에서 각각의 개념을 자세히 알아보고 예제를 살펴보겠습니다. 

preventDefault() : 기본 동작 차단 

이벤트가 발생했을 때, 브라우저의 기본 동작을 막는 메서드입니다. 예를 들어, <a> 태그는 기본적으로 클릭 시 다른 페이지로 이동하지만, preventDefault()를 사용하면 이동을 막을 수 있습니다. 

예제 1: 링크 이동 방지 

<a href="https://google.com" id="myLink">Google로 이동</a> 

<script> 
  document.getElementById("myLink").addEventListener("click", function(event) {
    event.preventDefault(); // 기본 동작 차단 
    alert("이 링크는 클릭해도 이동하지 않습니다!"); 
  });
</script>

 

preventDefault()를 호출하면 <a> 태그의 기본 동작(페이지 이동)이 차단됨. 

따라서 클릭해도 Google로 이동하지 않고 alert 창만 표시됨. 

예제 2: 

폼 제출 방지 보통 <form> 요소는 버튼을 클릭하면 자동으로 제출됩니다. 

하지만 preventDefault()를 사용하면 이를 방지할 수 있습니다.

<form id="myForm"> 
  <input type="text" placeholder="이름 입력" required> 
  <button type="submit">제출</button> 
</form>

<script> 
  document.getElementById("myForm").addEventListener("submit", function(event) {
    event.preventDefault(); // 폼 제출 방지 
    alert("폼이 제출되지 않았습니다!"); 
  });
</script>

설명: <form> 태그는 기본적으로 버튼 클릭 시 자동 제출됨. event.preventDefault()를 사용하면 폼이 서버로 전송되지 않음. 이를 활용하면 클라이언트 측 유효성 검사 후 제출 여부를 결정할 수 있음. 

stopPropagation() : 이벤트 전파 방지 

stopPropagation()이란? 

이벤트가 발생하면 버블링(Bubbling) 방식으로 부모 요소까지 전파됩니다. stopPropagation()을 사용하면 이벤트가 부모 요소로 전달되지 않도록 차단할 수 있습니다.

 예제 1:

 클릭 이벤트 전파 방지 아래 예제에서 버튼 클릭 시 부모 요소의 클릭 이벤트까지 실행되는 문제를 해결해보겠습니다. 

<div id="parent" style="padding: 20px; background: lightblue;"> 
  <button id="child">버튼 클릭</button> 
</div> 

<script> 
  document.getElementById("child").addEventListener("click", function(event) {
    event.stopPropagation(); // 부모 요소로 이벤트 전파 방지 
    alert("버튼이 클릭되었습니다!"); 
  }); 
  
  document.getElementById("parent").addEventListener("click", function() {
    alert("부모 요소가 클릭되었습니다!");
  });
</script>

설명: 버튼을 클릭하면 원래 부모 요소(div)의 이벤트도 실행됨. stopPropagation()을 사용하면 부모 요소로의 이벤트 전파를 차단할 수 있음. 

따라서 버튼을 클릭해도 "부모 요소가 클릭되었습니다!" 알림이 뜨지 않음.

 예제 2: 

이벤트 위임과 stopPropagation() 활용 이벤트 위임을 사용할 때 특정 요소만 이벤트가 실행되도록 **stopPropagation()**을 적용할 수도 있습니다.

<ul id="list"> 
  <li>아이템 1</li>
  <li>아이템 2</li> 
  <li>아이템 3</li>
</ul> 

<script> 
  document.getElementById("list").addEventListener("click", function(event) {
    if (event.target.tagName === "LI") { 
      event.stopPropagation(); // 이벤트 전파 차단 
      alert(event.target.innerText + " 클릭됨!"); } 
    }); 
    
    document.body.addEventListener("click", function() { 
      alert("body 클릭됨!"
    ); 
  }); 
 </script>

설명: <ul> 요소에 이벤트 리스너를 등록하여 이벤트 위임 적용. stopPropagation()이 없으면 <li> 클릭 시 body의 클릭 이벤트까지 실행됨. stopPropagation()을 적용하면 부모 요소(body)로 이벤트가 전달되지 않음! 

preventDefault() vs stopPropagation() 차이점 정리

메서드역할사용 예제 preventDefault() 기본 동작 차단 링크 이동, 폼 제출 방지 stopPropagation() 이벤트 전파 방지 부모 요소로 이벤트 전달 차단

간단한 요약:

  • preventDefault() → "이벤트는 발생하지만 기본 동작은 실행되지 않도록 한다!"
  • stopPropagation() → "이벤트가 부모 요소로 전파되지 않도록 막는다!"

마무리

반응형

'Frondend > JavaScript' 카테고리의 다른 글

[HTML/JavaScript] Document  (0) 2025.02.17
[JavaScript] JavaScipt Module System(모듈 시스템)  (0) 2025.02.15
[JavaSciprt] 이벤트 위임  (0) 2025.02.15
[JavaScript] 구조 분해 할당(Destructuring Assignment)  (1) 2025.02.13
[JavaScript] Spread Operator vs Rest Parameter  (0) 2025.02.13
'Frondend/JavaScript' 카테고리의 다른 글
  • [HTML/JavaScript] Document
  • [JavaScript] JavaScipt Module System(모듈 시스템)
  • [JavaSciprt] 이벤트 위임
  • [JavaScript] 구조 분해 할당(Destructuring Assignment)
JJuuuunn
JJuuuunn
  • JJuuuunn
    JJuuuunn
    JJuuuunn
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • Backend (7)
        • Java (7)
      • Frondend (48)
        • Vue.js (12)
        • JavaScript (21)
        • Css (1)
      • Infra (0)
      • Git (2)
      • CS (5)
        • DataBase (0)
        • Network (2)
        • OS (0)
        • Algorithm (0)
      • 리뷰 (5)
        • 강의 (1)
        • Books (4)
      • ETC (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    frontend
    혼자 공부하는 컴퓨터구조+운영체제
    Java
    VUE
    Network
    객체
    이벤트
    API
    깊은 감시
    신세계i&c
    Vue.js
    렌더링
    KDT
    javascript
    자바스크립트
    HTML
    혼공컴운
    axios
    Watch
    자바
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.1
JJuuuunn
[JavaScript] preventDefault() 와 stopPropagation()
상단으로

티스토리툴바