jQuery: добавление события click в динамический HTML

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для привязки обработчиков событий клика к динамически генерируемым элементам рекомендуется использовать метод .on(). Метод .live() устарел. Чтобы работать с элементами, имеющими класс .dynamic-btn, которые могут быть созданы в дальнейшем, следует применить следующей код:

JS
Скопировать код
$(document).on('click', '.dynamic-btn', function() {
  // Код обработки здесь.
});

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

Кинга Идем в IT: пошаговый план для смены профессии

Переходим с live на on

Метод .live() устарел и был заменён на .on(). Чтобы взаимодействовать с элементами, которые добавляются в DOM динамически, следует использовать именно .on().

Делегирование событий с помощью метода on()

Пример дельнего приёма, когда хозяин приветствует каждого гостя пожатием руки, отлично демонстрирует идею делегирования событий, которую мы применяем с помощью .on().

Этот метод позволяет оптимизировать назначение событий: привязываем одного обработчика к родительскому элементу, который затем делегирует выполнение функции каждому целевому дочернему элементу (созданный ранее или добавленный позже).

JS
Скопировать код
// Вот так приветствует гостей наш хозяин:
$('#parent-element').on('click', '.dynamic-item', function() {
  // Обработка клика.
});

По возможности стоит избегать использования $(document) в качестве родительского элемента для делегирования событий, чтобы улучшить инкапсуляцию и производительность.

Полифилл для live() в процессе перехода

Если вы ещё не готовы отказаться от .live(), можно временно использовать полифилл:

JS
Скопировать код
if (typeof jQuery.fn.live === 'undefined') {
  jQuery.fn.live = function(events, data, callback) {
    // Заменяем функционал 'live' на 'on':   
    jQuery(this.context).on(events, this.selector, data, callback);
  };
}

Такой полифилл функционирует как страховка: с его помощью старый код, использующий .live(), продолжит работать без ошибок.

Оптимизируем производительность с методом on()

Вот несколько рекомендаций для повышения производительности при использовании .on():

  • Привязывайте обработчики к ближайшим статическим родительским элементам.
  • Всегда проверяйте наличие элементов перед тем, как привязывать к ним события.
  • Чётко определите фильтр-селектор для дочерних элементов метода .on() для избирательного выделения динамических элементов.

Предотвращаем ошибки при использовании on()

Следите за потенциальными проблемами при использовании .on():

  • Контролируйте распространение событий и избегайте их случайного прерывания с помощью event.stopPropagation().
  • Точность селекторов: Убедитесь в правильном направлении селекторов на нужные элементы.
  • Динамические родительские элементы: Если родительский элемент, к которому привязан обработчик, был динамически изменён, связь может быть нарушена. Убедитесь, что родительский элемент всегда присутствует в DOM.

Визуализация

.live(): Это флаер, который раздаётся на входе и которым пренебрегают опоздавшие гости.

Markdown
Скопировать код
👤👤👤👤 – Получили флаер (📜)
🔽👤    – Флаер не получил

.on(): Это афиша на стене, которую замечают все, независимо от времени прихода.

Markdown
Скопировать код
👤👤👤👤 – Увидели афишу (🖼️)
🔽👤    – Также увидели афишу

Основная идея: с .on() ни один из прибывших не упустит событие, вне зависимости от времени прихода.

Полезные материалы

  1. jQuery .on() | jQuery API Documentation — Главный источник информации о методе .on().
  2. jQuery .live() | jQuery API Documentation — Информация о методе .live(), который считается устаревшим.
  3. Understanding Event Delegation | jQuery Learning Center — Обязательно к прочтению для понимания делегирования событий в jQuery.
  4. JavaScript Event handling for Dynamic DOM Elements | MDN — Всё, что нужно знать о работе с событиями на динамически изменяемых элементах DOM.
  5. jQuery .off() to Unbind Events | jQuery API Documentation — Способы отключения обработчиков событий, когда обстоятельства требуют корректировки.