이벤트 버블링과 캡쳐

2020. 3. 26. 00:57JavaScript

* 이벤트 버블링

 - 이벤트 발생시 그 상위 요소까지 전파되는 것을 말함

 - 이벤트는 document의 맨 꼭대기까지 전파됨 ( bottom -> top 형태 )

 

<body class="body">
  <div class="one">
    <div class="two">
      <div class="three"></div>
    </div>
  </div>
 </body>

 

const divs = document.querySelectorAll("div");

function logText(e) {
  console.log(this.classList.value);
}
 
divs.forEach(div => div.addEventListener("click", logText));

 

 - 가장 바깥쪽 div를 클릭했을 때의 결과는: one

 - 가운데 div를 클릭했을 때의 결과는: two one

 - 가장 안쪽 div를 클릭했을 때의 결과는: three two one

 

 

function logText(e) {
  e.stopPropagation();
  console.log(this.classList.value);
}

divs.forEach(div => div.addEventListener("click", logText));

 

 - 만일 이벤트 버블링을 멈추고 싶다면 event.stopPropagation( ) 을 이용

 - 가장 바깥쪽 div를 클릭했을 때의 결과는: one

 - 가운데 div를 클릭했을 때의 결과는: two

 - 가장 안쪽 div를 클릭했을 때의 결과는: three

 

 

 

* 이벤트 캡쳐

 - 이벤트 발생시 그 하위요소들까지 이벤트 전파

 - top -> bottom 형태

 - 이벤트 캡쳐를 구현하기 위해서는 addEventListener의 세번째 인자로 캡쳐 관련된 인자를 넘겨 주면 된다.

 

<body class="body">
  <div class="one">
    <div class="two">
      <div class="three"></div>
    </div>
  </div>
 </body>

 

const divs = document.querySelectorAll("div");

function logText(e) {
  console.log(this.classList.value);
}
 
divs.forEach(div => div.addEventListener("click", logText, {
  capture: true    // capture의 기본값은 false
}));

 

 - 가장 바깥쪽 div를 클릭했을 때의 결과는: one

 - 가운데 div를 클릭했을 때의 결과는: two one

 - 가장 안쪽 div를 클릭했을 때의 결과는: three two one

 

 

function logText(e) {
  e.stopPropagation();
  console.log(this.classList.value);
}

divs.forEach(div => div.addEventListener("click", logText, {
  capture: true
}));

 

 - 이벤트 캡쳐링에서도 event.stopPropagation( ) 을 사용 가능

 - 가장 바깥쪽 div를 클릭했을 때의 결과는: one

 - 가운데 div를 클릭했을 때의 결과는: one

 - 가장 안쪽 div를 클릭했을 때의 결과는: one

 

 

 

* Once

 - 해당 이벤트가 한 번만 실행되게 해 준다.

 - addEventListener의 세번째 인자로 once 관련된 인자를 넘겨 주면 구현할 수 있다.

 

<button class="button">BUTTON</button>

 

function logText(e) {
  console.log(this.classList.value);
}

button.addEventListener("click", logText, {
  once: true    // once의 기본값은 false
});

// result: button

 

 - 한 번 button을 클릭했을 때에는 결과값으로 button이 잘 나오지만, 두번째부터는 콘솔창에 결과값이 출력되지 않게 된다.

 

 

 

 

'JavaScript' 카테고리의 다른 글

Object Oriented Programming  (0) 2020.05.08
Closure  (0) 2020.04.28
function method, this  (0) 2020.03.18
rest parameter, arguments, spread 연산자  (0) 2020.03.03
template 태그 & fragment  (0) 2020.03.01