Uniwersalne delegowanie zdarzeń w JavaScript

Kod przedstawiony w poprzedniej lekcji jest działający, jednak nie jest pozbawiony wad. Przeanalizujmy te wady i napiszmy bardziej uniwersalne rozwiązanie.

Wada naszego kodu ujawni się w przypadku, gdy wewnątrz li znajdują się zagnieżdżone znaczniki. W naszym przypadku niech będą to znaczniki i:

html<ul>
  <li>item <i>italic</i> item</li>
  <li>item <i>italic</i> item</li>
  <li>item <i>italic</i> item</li>
  <li>item <i>italic</i> item</li>
  <li>item <i>italic</i> item</li>
</ul>

W tym przypadku kliknięcie na znacznik i spowoduje dodanie wykrzyknika na końcu znacznika i, a nie znacznika li, jak byśmy chcieli - ponieważ do event.target trafia dokładnie ten znacznik, w którym zdarzenie wystąpiło.

Problem można rozwiązać za pomocą metody closest:

javascriptlist.addEventListener('click', function(event) {
  let li = event.target.closest('li');
  
  if (li) {
    li.innerHTML = li.innerHTML + '!';
  }
});
Задание 1

Powtórz przedstawione rozwiązanie.