Задать вопрос
@wakenbyWork

Как реализовать jquery event delegation на чистом js?

Как делегирование реализовать на чистом js чтобы был синтаксис такой-же как в jquery или схожий?

$(document).on('click', '.selector', function (event) {})


Нашел пример кода на чистом js https://youmightnotneedjquery.com/#delegate но не понимаю как его использовать. Хочется чтобы было удобно как в jquery и событие можно было удалить))

Так-же нашел такое решение:

function delegateEventListener (element, eventType, childSelector, handler) {
  function delegate (event) {
    let bubble

    const validElements=[].slice.call(this.querySelectorAll(childSelector)).reverse().filter((matchedElement) => {
      return matchedElement.contains(event.target);
    })

    validElements.forEach((validElement) => {
      if(bubble===undefined || bubble!==false) bubble=handler.call(validElement, event)
    })
  }

  element.addEventListener(eventType,delegate)

  return delegate;
}

export default delegateEventListener


Нет ли лучше? И можно его как-то в прототип eventTarget прописать?
  • Вопрос задан
  • 129 просмотров
Подписаться 2 Средний 2 комментария
Решения вопроса 1
Stalker_RED
@Stalker_RED
document.addEventListener('click', function myClickHandler(evt) { // слушаем все клики
  if (evt.target.matches('.selector')){ // проверяем был ли это клик по .selector
    // do your stuff
  }
});

но обычно лучше так:
document.addEventListener('click', function myClickHandler(evt) { // слушаем все клики
  const elem = evt.target.closest('.selector');
  if (elem){ // если клик мимо, то тут null
    // do your stuff
  }
});

такой подход срабатывает когда внутри вашего .selector еще какие-то элементы, иконки, и прочая, и вам все равно нужно отследить. Более универсальное решение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы