Sobes.tech
Junior

Ի՞նչ է դելեգատացիան։

sobes.tech AI

Պատասխան AI-ից

Դատավարության փոխանցումը՝ դա նախագծային ձևաչափ է, որը թույլ է տալիս մեկ իրադարձության մշակողին կառավարել բազմաթիվ երեխաների տարրերի իրադարձությունները: Փոխարենը յուրաքանչյուր տարրին մշակող նշանակելու, մշակողը նշանակվում է ծնողական տարրին: Երբ իրադարձությունը տեղի է ունենում երեխային վրա, այն «վերել է» (bubbling) մինչև ծնողը, որտեղ մշակողը կարող է այն բռնել և մշակել:

Աշխատանքի սկզբունքը:

  • Իրադարձությունը ստեղծվում է նպատակային տարրին (օրինակ, <button>):
  • Իրադարձությունը տարածվում է DOM ծառի վերև՝ ծնողական տարրերի կողմը:
  • Իրադարձության մշակողը, որը կապված է ծնողական տարրին, բռնում է իրադարձությունը:
  • Մշակողը կարող է որոշել, թե որ երեխանային տարրին է տեղի ունեցել իրադարձությունը, օգտագործելով event.target:

Առավելությունները:

  • Արդյունավետություն: Փոքր թվով իրադարձության մշակողներ, ինչը նվազեցնում է հիշողության և պրոցեսորի սպառումը, հատկապես մեծ ցանկերի կամ աղյուսակների դեպքում:
  • Ինքնավար կառավարում: Հեշտ է ավելացնել և հեռացնել տարրեր DOM-ից, քանի որ մշտապես անհրաժեշտ չէ կապել/անջատել մշակողներ:
  • Կոդի մաքրություն: Փոքր կրկնվող կոդ՝ մշակողներ կապելու համար:

Օրինակ:

Նախ ասենք, ունենք տարրերի ցանկ, և ուզում ենք արձագանքել յուրաքանչյուր տարրի վրա սեղմմանը:

Անցյալում, առանց փոխանցման, պետք է կապել մշակող յուրաքանչյուր <li>-ին:

// Ստանում ենք բոլոր `<li>` տարրերը
const listItems = document.querySelectorAll('li');

// Կապում ենք մշակող յուրաքանչյուր տարրին
listItems.forEach(item => {
    item.addEventListener('click', function() {
        console.log('Սեղմվել է՝', this.textContent);
    });
});

Փոխանցմամբ, մենք կապում ենք միայն <ul>-ին:

// Ստանում ենք ծնողական ցանկը
const list = document.querySelector('ul');

// Կապում ենք մշակողը ցանկին
list.addEventListener('click', function(event) {
    // Ստուգում ենք, արդյոք սեղմումը տեղի է ունեցել `<li>`-ի վրա
    if (event.target.tagName === 'LI') {
        console.log('Սեղմվել է՝', event.target.textContent);
    }
});

Այս օրինակով մենք օգտագործում ենք event.target-ը՝ որոշելու համար, թե որ <li>-ն է սեղմվել։