반응형

Event Bubbling vs. Capturing

 

글. 수알치 오상문 

 

HTML 요소는 트리 구조 형태로 계층 관계가 존재한다. 어떤 요소에 특정 이벤트가 발생했을 때 부모쪽으로 전파될 수도 있고 자식쪽으로 전파될 수도 있다. 

 

Bubbling : 부모쪽으로 이벤트가 전파 (기본)

Capturing : 자식쪽으로 이벤트가 전파 (옵션)

 

다음 예제 코드는 세 개 제품 이미지 항목을 보여준다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Click Event</title>
</head>
<body>
<ul>
  <li> <img src="product1.jpg" class="product-img" > </li>
  <li> <img src="product2.jpg" class="product-img" > </li>
  <li> <img src="product3.jpg" class="product-img" > </li> 
</ul>
<section class="info"></section>
</body>
</html>

 

어떤 이미지를 클릭하면 동작하는 자바스크립트 예는 다음과 같다. 

 

[예제 코드] Bubbling을 이용하여 부모 ul 태그에서 처리 

// 자식 li에 발생한 이벤트를 부모 ul에서 처리 
ul.addEventListener("click",function(evt) {    
    console.log(evt.currentTarget, evt.target);
    info.innerHTML = "click event!!! : " + evt.target.src;
});

 

[예제 코드]  클릭한 이미지 src 정보 확인 예제 (이미지나 패딩 부분 클릭 시 동작)

var ul = document.querySelector("ul");
ul.addEventListener("click",function(evt) {
    if(evt.target.tagName === "IMG") {
      console.log("clicked" + evt.target.src);
      info.innerHTML = "click event!!! : " + evt.target.src;
    } else if (evt.target.tagName === "LI") {
      console.log("clicked" + evt.target.firstChild.src);
      info.innerHTML = "click event!!! : " + evt.target.firstChild.src;
    }
});

 

[예제 코드] 안 좋은 예 (이미지마다 이벤트 설정) 

var list = document.querySelectorAll("ul > li");
for(var i=0,len=list.length; i < len; i++) {
  list[i].addEventListener("click", function(evt) {
     // 이벤트 발생 시 처리... 
     consol.log("clicked" + evt.currentTarget.firstChild.src);
     info.innerHTML = "click event!!! : " + evt.currentTarget.firstChild.src;
  });
}

 

[참고] https://javascript.info/bubbling-and-capturing

 

Bubbling and capturing

 

javascript.info

 

 

반응형

+ Recent posts