우리가 자바스크립트에서 동적으로 웹을 만들기 위해서 가장 많이 사용하는 addEventListener
메소드를 사용했을때, 이벤트가 작용하는 대상을 찾아가는 과정
이벤트 흐름에는 두 가지 흐름이 있는데 그게 바로 캡처링과 버블링 단계임
window.addEventListener('click', () => {
console.log("window capture!");
}, true);
window.addEventListener('click', () => {
console.log("window bubble!");
}, false); // false는 생략 가능
여기서 잠깐! event.preventDefault()와 혼돈 X 개념 꽉 잡자
event.preventDefault()는 태그 요소가 작동하는 기본 이벤트 자체를 아예 중지하는 역할이다.
예를 들면, a태그를 사용하면 해당 주소 페이지로 렌더링해줘야 하지만, event.preventDefault()를 사용하면 페이지가 넘어가지 않는다.
* 버튼을 누르면 target은 버튼, currenTarget/ this는 article을 참조
<body>
<article class="parent">
<button type="button">버튼임</button>
</article>
<script>
const parent = document.querySelector(".parent");
parent.addEventListener("click", function (event) {
console.log(event.target, "target"); // <button>
console.log(event.currentTarget, "currnetTarget"); // <article>
console.log(this, "this"); // <article>
});
</script>
</body>
부모 요소에 이벤트를 '한 번만' 걸어서, 하위 요소들 전체에 이벤트를 발생시킬 수 있는 방법
<body>
<article class="parent">
<button type="button">버튼 1</button>
<button type="button">버튼 2</button>
</article>
<script>
const $parent = document.querySelector('.parent');
$parent.addEventListener('click',() => {
if(event.target.nodeName === "BUTTON") {
event.target.innerHTML = "hello world"
}
})
</script>
</body>
article에 이벤트를 주었지만 두 버튼 모두 이벤트 발생