Իվենթի բուբլինգի ժամանակ թիրախային տարրի ստացում

Ենթադրենք ունենք երկու տարր՝ 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, կամ պարագրաֆ
});

Կարելի է տարբերակել այս երկու տարբերակները՝ օգտագործելով պայմաններ՝

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-ի վրա կլիկ անելիս console-ում տպվի դրա մասին տեղեկություն։