<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Event Bubbling Example</title>
</head>
<body>
<div id="parent" style="padding: 20px; background-color: lightblue;">
Parent Div
<button id="child" style="margin-top: 10px;">Click Me</button>
</div>
<script>
// 부모 요소에 이벤트 리스너 추가
document.getElementById("parent").addEventListener("click", () => {
alert("Parent Div Clicked (Event Bubbling)");
});
// 자식 요소에 이벤트 리스너 추가
document.getElementById("child").addEventListener("click", (event) => {
alert("Button Clicked");
// 이벤트 버블링을 멈추려면 아래 주석 해제
// event.stopPropagation();
});
</script>
</body>
</html>
<body>
→ <html>
까지 전파된다.event.stopPropagation()
를 사용할 수 있다."id=child"
버튼을 클릭하면 먼저 버튼의 이벤트가 실행된 후 부모 div
의 이벤트가 실행된다. stopPropagation()
을 사용하면 버블링을 막을 수 있다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Event Capturing Example</title>
</head>
<body>
<div id="parent" style="padding: 20px; background-color: lightcoral;">
Parent Div
<button id="child" style="margin-top: 10px;">Click Me</button>
</div>
<script>
// 부모 요소에 캡처링 이벤트 리스너 추가
document.getElementById("parent").addEventListener("click", () => {
alert("Parent Div Clicked (Event Capturing)");
}, { capture: true });
// 자식 요소에 이벤트 리스너 추가
document.getElementById("child").addEventListener("click", () => {
alert("Button Clicked");
});
</script>
</body>
</html>
document
→ <html>
→ <body>
→ ... → 클릭한 요소 순서로 이벤트가 전달된다.{ capture: true }
옵션을 사용하여 캡처링을 활성화했다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Event Delegation Example</title>
</head>
<body>
<ul id="itemList">
<li data-action="edit">Edit Item</li>
<li data-action="delete">Delete Item</li>
<li data-action="view">View Item</li>
</ul>
<script>
// 이벤트 위임: 리스트의 부모 요소에 이벤트 리스너 추가
document.getElementById("itemList").addEventListener("click", (event) => {
const action = event.target.getAttribute("data-action");
if (action) { // 클릭한 요소에 data-action 속성이 있을 때
switch(action) {
case "edit":
alert("Editing item...");
break;
case "delete":
alert("Deleting item...");
break;
case "view":
alert("Viewing item...");
break;
}
}
});
</script>
</body>
</html>
data-action
에 따라 다른 함수를 실행하는 방법을 사용할 수 있다.ul
요소에 이벤트 리스너를 추가하여 li
항목에 대한 클릭을 처리한다. ul
의 이벤트 리스너로 관리할 수 있어 효율적이다.