Obtendo o elemento alvo durante a propagação de eventos

Suponha que temos dois elementos: uma div e um parágrafo p, localizado dentro dessa div:

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

Vamos obter uma referência para nossa div em uma variável:

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

Vamos adicionar alguns estilos às nossas tags:

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

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

Agora, vamos supor que um manipulador de clique esteja anexado à div:

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

Como nossa div tem padding, quando clicamos na div, podemos acertar o parágrafo, ou podemos acertar um local onde o parágrafo não está, ou seja, diretamente na div.

Neste caso, no manipulador de clique, this sempre apontará para o elemento ao qual o manipulador está anexado. No nosso caso, é a nossa div:

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

No entanto, podemos obter exatamente a tag onde o evento ocorreu. Para isso, podemos verificar o que está em event.target:

javascriptdiv.addEventListener('click', function(event) {
  console.log(event.target); // ou a div, ou o parágrafo
});

Podemos distinguir essas duas opções usando condicionais:

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

div.addEventListener('click', function(event) {
  if (event.target.tagName === 'DIV') {
    console.log('clique exatamente na div');
  }
  if (event.target.tagName === 'P') {
    console.log('clique exatamente no parágrafo');
  }
});

Em vez de tagName, podemos usar matches:

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

div.addEventListener('click', function(event) {
  if (event.target.matches('div')) {
    console.log('clique exatamente na div');
  }
  if (event.target.matches('p')) {
    console.log('clique exatamente no parágrafo');
  }
});
Задание 1

Os seguintes elementos são fornecidos:

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;
}

Anexe um manipulador de clique à div. Neste manipulador, determine em qual das tags o evento foi acionado.

Задание 2

Modifique a tarefa anterior. Faça com que ao clicar em um li, um ponto de exclamação seja adicionado ao seu final, e ao clicar na ul, informações sobre isso sejam exibidas no console.