본문 바로가기
JavaScript/JavaScript

Javascript) 이벤트 전파, Trigger Event

by 박채니 2022. 5. 30.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


이벤트 전파 (Event Propagation)

- 이벤트는 전파됨

- bubbling : 자식 요소에서 부모 요소로 전파 (기본속성)

 

HTML 코드

<div id="bubble1" class="bubble bubble1">
    <div id="bubble2" class="bubble bubble2">
        <div id="bubble3" class="bubble bubble3"></div>
    </div>
</div>

 

CSS 코드

<style>
.bubble {border: 1px solid black; padding: 20px;}
.bubble1 {background-color: lightblue;}
.bubble2 {background-color: lightcoral;}
.bubble3 {background-color: lightgreen;}
</style>

 

Javascript 코드

document.body.addEventListener('click', (e) => {
    console.log('body 클릭!', e.target);
});

document.querySelector('#bubble1').addEventListener('click', (e) => {
    console.log('#bubble1 클릭!', e.target);
});

document.querySelector('#bubble2').addEventListener('click', (e) => {
    console.log('#bubble2 클릭!', e.target);
});

document.querySelector('#bubble3').addEventListener('click', (e) => {
    console.log('#bubble3 클릭!', e.target);
});

 

bubble3 클릭 시

bubble3만 클릭하였는데, 이벤트가 전파되어 bubble2와 bubble1, body 또한 이벤트가 발생되었습니다.

 

bubble2 클릭 시

bubble2를 클릭하였더니, 부모 → 자식으로 전파되어 bubble1, body의 이벤트도 발생되었습니다.

 

bubble1 클릭 시

bubble1를 클릭하였더니, 마찬가지로 이벤트가 전파되어 body의 이벤트도 발생되었습니다.

 

 

이벤트 전파 방지

stopPropagation()

document.querySelector('#bubble3').addEventListener('click', (e) => {
    console.log('#bubble3 클릭!', e.target);
    e.stopPropagation();
});

stopPropagation()을 이용하여 이벤트의 전파를 방지할 수도 있습니다.

 

 

이벤트 전파 특성을 이용하여 클릭 이벤트를 하나만 생성하고 모두 처리하기

document.body.addEventListener('click', (e) => {
    // console.log('body 클릭!', e.target);

    switch(e.target) {
        case bubble1 : console.log('#bubble1 클릭!', e.target); break;
        case bubble2 : console.log('#bubble2 클릭!', e.target); break;
        case bubble3 : console.log('#bubble3 클릭!', e.target); break;
    }
});

자식 요소에서 부모 요소로 이벤트가 전파되는 특성을 이용하여 부모 요소에서 발생한 click이벤트의 target을 받아 처리를 해줄 수 있습니다.

 


Trigger Event

 

HTML 코드

<h3 id="counter"></h3>
<button id="btn-trigger-counter">클릭</button>

 

Javascript 코드

let num = 0;
counter.innerHTML = num;

counter.addEventListener('click', () => {
    num++;
    counter.innerHTML = num;
});

document.querySelector("#btn-trigger-counter").addEventListener('click', () => {
    const event = new MouseEvent('click');
    counter.dispatchEvent(event);
});

 

new MouseEvent('click')으로 이벤트를 하나 생성 한 후 dispatchEvent로 생성한 이벤트를 보내주어 클릭 버튼을 누를 때도 기존 이벤트 속성에 덧붙여서 숫자 카운팅이 될 수 있게끔 해주었습니다.