DOM 이벤트 관리 - ChoDragon9/posts GitHub Wiki
useCapture
매개변수를 사용해 핸들러의 실행 순서를 반대로 할 수 있다.
즉, addEventListener
를 호출 할 때 useCapture
매개변수에 ture
를 사용하면 버블 단계 대신 캡처 단계에 이벤트 핸들러를 추가한다는 것을 의미한다.
생성된 모든 DOM 이벤트에 대해 브라우저는 캡처 단계(하향식)를 실행한 다음 버블 단계(상향식)를 실행한다는 것을 명심하자, 목표 단계라고 하는 세 번째 단계도 있다. 이 특별한 단계는 이벤트가 목표 요소에 도달할 때 발생한다.
<div>
<button>Button</button>
</div>
<script>
const button = document.querySelector('button');
const div = document.querySelector('div');
div.addEventListener('click', () => {
console.log('[Capture] Div');
}, true);
div.addEventListener('click', () => {
console.log('[Bubble] Div');
}, false);
button.addEventListener('click', () => {
console.log('[Capture] Button');
}, true);
button.addEventListener('click', () => {
console.log('[Bubble] Button');
}, false);
</script>
[Capture] Div
[Capture] Button
[Bubble] Button
[Bubble] Div
detail
객체를 사용해 추가 데이터를 핸들러에 전달할 수 있다.
const EVENT_NAME = 'FiveCharInputValue'
const button = document.querySelector('button')
button.addEventListener('click', () => {
const event = new CustomEvent(EVENT_NAME, {
detail: {
date: Date.now()
}
});
button.dispatchEvent(event);
});
button.addEventListener(EVENT_NAME, (e) => {
console.log(e);
})
template
태그는 이름에 알 수 있듯이 렌더링 엔진의 스탬프로 사용할 수 있는 보이지 않는 태그다.
<template id="todo-item">
<li></li>
</template>
<script>
console.log(document.querySelector('li')); // null
</script>