События для динамически добавленных элементов в jQuery

jQuery работает с элементами, которые были на странице на момент инициализации кода.

Если добавляются новые элементы — при помощи ajax’а или функций типа append() — то события не затрагивают их.

Как же работать с новыми созданными элементами DOM?

Оказывается для динамических элементов используется делегированная обработка событий.

Если кратко, то смысл делегирования в том, что обработчики «навешиваются» не на отсутствующие в dom элементы, а на существующий родительский объект.

Таким образом, при срабатывании соответствующего события (в моем примере это будет body), будет вызван данный обработчик для всех элементов, соответствующих селектору, даже если этих элементов не было во время объявлении обработчика (например при загрузке страницы).

Вот пример и код к нему

добавить

<style>
.example
{
display:block;
width: 200px;
}
.example li
{
margin: 4px;
}
</style>
<script>
$(document).ready(function () {
$("body").on("click", ".remove-button", function () {
      $(this).parent().remove();
    });

$("body").on("click", ".create-button", function () {
      var countPlayers = $('.example li').length;
      var player = '<li>Игрок ' + (countPlayers+1)  + 
      ' <a href="javascript: return false;" class="remove-button right">Удалить</a></li>';
      $('.example').append(player);
    });
});
</script>
<ul class="example">
<li>Игрок 1 <a href="javascript: return false;" class="remove-button right">Удалить</a></li>
<li>Игрок 2 <a href="javascript: return false;" class="remove-button right">Удалить</a></li>
<li>Игрок 3 <a href="javascript: return false;" class="remove-button right">Удалить</a></li>
<li>Игрок 4 <a href="javascript: return false;" class="remove-button right">Удалить</a></li>
</ul>
<a href="javascript: return false;" class="create-button">добавить</a>

13 комментариев

  • Alex

    05.10.2017

    Спасибо!

    Reply
  • Max

    04.12.2017

    Благодарю, очень пригодилось)

    Reply
    • Qood

      17.02.2022

      А если не использовать jquery

      Reply
  • Михуил

    28.12.2017

    Наверное прикольно быть умным) На самом деле коммент ради бесплатной ссылки на мой блог)

    Reply
  • Alexander

    02.02.2018

    Спасибо, пригодилось

    Reply
  • Dmitriy

    28.10.2018

    А тормозить не будет?

    Reply
  • Алексей

    08.12.2019

    Огромное спасибо!

    Reply
  • Виктор

    24.07.2020

    Спасибо!
    Отличный пример, пригодилось!

    Reply
  • Санек

    08.02.2021

    код нельзя в нормальном читабельном виде написать?

    Reply
    • moxiemaks

      28.02.2021

      Да без проблем. Кидай пример, посмотрим, может быть сделаем, чтоб тебе понравилось.

      Reply
  • Евгений

    21.04.2021

    Спасибо!

    Reply
  • Vitaliy

    07.08.2021

    Сколько будет стоить установка LazyLoad на мой сайт?

    Reply
  • Artem

    10.03.2022

    А как сделать то же самое только не для события click а для hover?

    Reply

Добавить комментарий для Евгений Отменить ответ