세모이
개발 계발
세모이
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 알고리즘 (1)
    • 자바스크립트 (29)
    • 리액트 (10)
    • HTML&CSS (2)
    • TIL (26)
    • 파이썬 (8)
    • Dev (1)
    • 데일리 (3)
      • 2023 (3)
      • 2025 (0)
    • 에러일기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바스크립트 프로퍼티 어트리뷰트
  • 자바스크립트
  • 자바스크립트 생성자 함수에 의한 객체 생성
  • 자바스크립트 깊은 복사 얕은 복사
  • const let 키워드와 블록레벨 스코프
  • 자바스크립트 함수와 일급 객체
  • 자바스크립트 전역 변수의 문제점
  • 모던 자바스크립트 deep deive
  • 개발자 도구 Network
  • 시멘틱 태그
  • 옵셔널 체이닝
  • html 신기한 태그
  • 자바스크립트 프로토타입
  • 리액트 key
  • 자바스크립트 빌트인 객체
  • 자바스크립트 strict mode
  • &&연산자
  • 모던 자바스크립트 deep dive
  • 함수
  • 모던 자바스크립트

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
세모이
TIL

이벤트 버블링 & 캡처링 & 위임

TIL

이벤트 버블링 & 캡처링 & 위임

2022. 4. 19. 12:05
반응형

이벤트 버블링 - 한 요소에 이벤트가 발생하면, 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작합니다. 가장 최상단의 조상 요소를 만날 때까지 이 과정이 반복되면서 요소 각각에 할당된 핸들러가 동작

<div class="one">
      첫번째
      <div class="two">
        두번째
        <button class="three">세번째</button>
      </div>
</div>
var divs = document.querySelectorAll('div');
divs.forEach(function(div) {
	div.addEventListener('click', logEvent);
});

function logEvent(event) {
	console.log(event.currentTarget.className);
}

var button = document.querySelector('button');
button.addEventListener('click', logEvent);

//버튼 클릭시
//three -> two -> one

버튼을 클릭 했을 시 <button>에 할당된 onclick 이벤트가 동작 하고 그 상위의 div 이벤트가 순차적으로 일어난다.

왜 버튼만 클릭했을 뿐인데 3개의 이벤트가 발생하는 건가?

  • 브라우저가 이벤트를 감지하는 방식 때문이다.
  • 브라우저는 특정 화면 요소에서 이벤트가 발생했을 때 그 이벤트를 최상위에 있는 화면 요소까지 이벤트를 전파 시킨다.
  • 태그마다 이벤트가 등록되어 있기 때문에 상위 요소로 이벤트가 전달되는 것을 확인 할 수 있고 이벤트가 등록되어 있지 않으면 동작 결과는 달라 질 수 있다.

 

 

이벤트 캡처링 - 이벤트 버블링과 반대 방향으로 진행되는 이벤트 전파 방식

addEventListener의 세번 째 요소를 작성하지 않으면 default 값이 false 인데, false로 설정할 경우 핸들러는 버블링 단계로 설정되고 capture:true로 설정할 경우 핸들러는 캡처링 단계로 설정

var divs = document.querySelectorAll('div');
divs.forEach(function(div) {
	div.addEventListener('click', logEvent,{
    capture:true
});
});

function logEvent(event) {
	console.log(event.currentTarget.className);
}

var button = document.querySelector('button');
button.addEventListener('click', logEvent, {
    capture:true
});

//버튼 클릭시
//one -> two -> three

- event.stopPropagation()

  • 원하는 화면 요소의 이벤트만 작동을 시키고 싶은 때
  • stopPropagation() 함수는 해당 이벤트가 전파되는 것을 막는다.

 

 

이벤트 위임 - 하위 요소에 각각 이벤트를 붙이지 않고 상위 요소에서 하위 요소의 이벤트들을 제어하는 방식

<h1>오늘의 할 일</h1>
    <ul class="itemList">
      <li>
        <input type="checkbox" id="item1" />
        <label for="item1">이벤트 버블링 학습</label>
      </li>
      <li>
        <input type="checkbox" id="item2" />
        <label for="item2">이벤트 캡쳐 학습</label>
      </li>
    </ul>
// 간단한 체크 박스 만들고 체크박스 클릭시 경고창 뜨도록 함
var inputs = document.querySelectorAll('input');
inputs.forEach(function(input) {
	input.addEventListener('click', function(event) {
		alert('clicked');
	});
});

// 새 리스트 아이템을 추가하는 코드
var itemList = document.querySelector('.itemList');

var li = document.createElement('li');
var input = document.createElement('input');
var label = document.createElement('label');
var labelText = document.createTextNode('이벤트 위임 학습');

input.setAttribute('type', 'checkbox');
input.setAttribute('id', 'item3');
label.setAttribute('for', 'item3');
label.appendChild(labelText);
li.appendChild(input);
li.appendChild(label);
itemList.appendChild(li);

새로 추가한 리스트 아이템에는 클릭 이벤트가 정상적으로 동작하지 않는다.

why? 인풋 박스에 이벤트를 추가하는 시점에서는 리스트 아이템은 2개이기 때문에 그럼 추가하는 리스트 아이템은 일일이 이벤트를 달아줘야 하는가?

→ 리스트 아이템이 많아질 수록 이벤트를 다루는게 번거러워 지는데 이걸 해결하는 방법이 이벤트 위임이다.

반응형

'TIL' 카테고리의 다른 글

클로저  (0) 2022.04.19
SSR vs CSR  (0) 2022.04.04
브라우저 렌더링 과정  (0) 2022.04.04
자바스크립트 데이터 타입  (0) 2022.03.15
WebRTC ver.1  (0) 2022.03.14
    'TIL' 카테고리의 다른 글
    • 클로저
    • SSR vs CSR
    • 브라우저 렌더링 과정
    • 자바스크립트 데이터 타입
    세모이
    세모이
    개발 공부!
    개발 계발개발 공부!

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.