요소에 이벤트를 등록하는 일반적인 방법은 addEventListener
를 이용하는 것이다. 그렇다면 100개 요소에 이벤트를 등록하고 싶다면 어떻게 해야할까? 일일이 연결해야 할까?
이벤트흐름을 잘 이용하면 1개의 이벤트 리스너로 수 많은 요소의 이벤트를 처리할 수 있다.
이벤트 리스너가 div(파란영역)요소에 있고, 사용자가 div의 자식인 button을 클릭하면 어떤 일이 일어날까?
브라우저는 이벤트가 발생한 button 태그를 찾기 시작할 것이다.
이벤트 캡처링과 버블링을 통해 button 태그의 부모 요소인 div의 이벤트 리스너를 실행시킨다.
이때 event 객체에는 DOM에서 일어나는 이벤트의 정보가 들어있다. event.currentTarget은 이벤트가 등록된 요소를 가리킨다. 이는 이벤트리스너 안의 this가 참조하는 대상과 동일하다. 그리고 이벤트가 최초에 발생한 요소는 event.target에 참조된다.
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>
<button type="button">Button</button>
</div>
<script>
const divEl = document.querySelector('div');
divEl.style = "background: red";
divEl.addEventListener('click', function(event) {
console.log(event.currentTarget);
console.log(event.target);
console.log(this);
});
</script>
</body>
</html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="parent">
<button type="button">generate tiem</button>
<ul>
<li>init</li>
</ul>
</div>
<script>
const parent = document.querySelector('.parent');
parent.addEventListener('click', function(e) {
if (e.target.tagName.toLowerCase() === 'button') {
const item = document.createElement('li');
item.innerText = 'Hello World';
parent.querySelector('ul').appendChild(item)
}
if (e.target.tagName.toLowerCase() === 'li') {
console.log('hit');
}
});
</script>
</body>
</html>