მოვლენების ამოსვლისას სამიზნე ელემენტის მიღება

დავუშვათ, გვაქვს ორი ელემენტი: div და აბზაცი p, რომელიც მდებარეობს ამ div-ის შიგნით:

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, ან აბზაცი
});

ეს ორი ვარიანტი შესაძლებელია განვასხვაოთ პირობების საშუალებით:

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-ზე დაწკაპუნებისას კონსოლში გამოიტანოს ინფორმაცია ამის შესახებ.