Tikslinio elemento gavimas įvykių plitimo metu

Tarkime, kad turime du elementus: div ir pastraipą p, esančią šio div viduje:

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

Gaukime nuorodą į mūsų div kintamajame:

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

Pridėkime kai kuriuos stilius mūsų žymoms:

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

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

Tarkime, kad dabar div turi pridėtą paspaudimo apdorojimo funkciją:

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

Dėl to, kad mūsų div turi padding, kai mes spaudžiame ant div, galime pataikyti į pastraipą, arba galime pataikyti į vietą, kur šios pastraipos nėra, tai yra tiesiogiai į div.

Šiuo atveju paspaudimo apdorojimo funkcijoje this visada rodys į tą elementą, ant kurio pridėta apdorojimo funkcija. Mūsų atveju tai mūsų div:

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

Tačiau, mes galime gauti būtent tą žymą, kurioje įvyko įvykis. Tam mes galime patikrinti, kas yra event.target:

javascriptdiv.addEventListener('click', function(event) {
  console.log(event.target); // arba div, arba pastraipa
});

Galima atskirti šiuos du variantus naudojant sąlygas:

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

div.addEventListener('click', function(event) {
  if (event.target.tagName === 'DIV') {
    console.log('paspaudimas būtent ant div');
  }
  if (event.target.tagName === 'P') {
    console.log('paspaudimas būtent ant pastraipos');
  }
});

Vietoj tagName galima naudoti matches:

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

div.addEventListener('click', function(event) {
  if (event.target.matches('div')) {
    console.log('paspaudimas būtent ant div');
  }
  if (event.target.matches('p')) {
    console.log('paspaudimas būtent ant pastraipos');
  }
});
Задание 1

Duoti šie elementai:

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

Pridėkite prie div paspaudimo apdorojimo funkciją. Šioje apdorojimo funkcijoje nustatykite, kurioje iš žymų įvyko įvykis.

Задание 2

Modifikuokite ankstesnę užduotį. Padarykite taip, kad paspaudus ant li, į jos galą būtų pridėtas šauktukas, o paspaudus ant ul konsolėje būtų išvesta informacija apie tai.