이벤트 버블링에서 대상 요소 얻기

두 개의 요소가 있다고 가정해 봅시다: div 와 그 안에 있는 문단 p:

html<div>
  <p></p>
</div>

div에 대한 참조를 변수에 저장합시다:

javascriptlet div = document.querySelector('div');

태그에 몇 가지 스타일을 추가해 봅시다:

cssdiv {
  padding: 20px;
  border: 1px solid red;
}

p {
  width: 200px;
  height: 200px;
  border: 1px solid green;
}

이제 div에 클릭 이벤트 핸들러를 추가합니다:

javascriptdiv.addEventListener('click', function() {
  console.log('click');
});

div에 padding이 있기 때문에, div를 클릭할 때, 문단을 클릭할 수도 있고, 문단이 없는 곳, 즉 div 자체를 직접 클릭할 수도 있습니다.

이때 클릭 핸들러 내의 this는 항상 핸들러가 연결된 요소를 가리킵니다. 우리의 경우 이는 div입니다:

javascriptdiv.addEventListener('click', function() {
  console.log(this); // div
});

그러나, 실제로 이벤트가 발생한 정확한 태그를 얻을 수 있습니다. 이를 위해 event.target에 무엇이 있는지 확인할 수 있습니다:

javascriptdiv.addEventListener('click', function(event) {
  console.log(event.target); // div 또는 p
});

조건문을 사용하여 이 두 가지 경우를 구분할 수 있습니다:

javascriptlet div = document.querySelector('div');

div.addEventListener('click', function(event) {
  if (event.target.tagName === 'DIV') {
    console.log('div를 직접 클릭함');
  }
  if (event.target.tagName === 'P') {
    console.log('문단을 직접 클릭함');
  }
});

tagName 대신 matches를 사용할 수 있습니다:

javascriptlet div = document.querySelector('div');

div.addEventListener('click', function(event) {
  if (event.target.matches('div')) {
    console.log('div를 직접 클릭함');
  }
  if (event.target.matches('p')) {
    console.log('문단을 직접 클릭함');
  }
});
Задание 1

다음 요소들이 주어졌습니다:

html<div>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ul>
</div>
cssdiv, ul, li {
  padding: 20px;
}

div {
  border: 1px solid red;
}
ul {
  border: 1px solid orange;
}
li {
  border: 1px solid green;
}

div에 클릭 이벤트 핸들러를 추가하세요. 이 핸들러 내에서 이벤트가 어떤 태그에서 발생했는지 판별하세요.

Задание 2

이전 문제를 수정하세요. li를 클릭하면 그 끝에 느낌표가 추가되고, ul를 클릭하면 콘솔에 그 정보가 출력되도록 만드세요.