Отслеживание изменений DOM в JavaScript и jQuery: примеры

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

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

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

Для отслеживания изменений в DOM предназначен MutationObserver. Воспользуйтесь следующим примером кода:

JS
Скопировать код
const observer = new MutationObserver((mutations) => {
  mutations.forEach(({type, attributeName}) => {
    console.log(`Тип изменения: ${type}, изменённый атрибут: ${attributeName}`);
  });
});

observer.observe(document.getElementById('watchedElement'), {
  attributes: true,
  childList: true,
  subtree: true
});

// При необходимости отключите наблюдатель
// observer.disconnect();

Инструкция к использованию: Создайте экземпляр MutationObserver, передайте ему функцию для сбора изменений. Укажите параметры отслеживания в методе observe(). По окончании наблюдения используйте disconnect().

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

Вопросы производительности и совместимости

MutationObserver успешно сменил устаревшие события DOM3 типа DOMNodeInserted и DOMAttrModified, одновременно решив возникающие при их использовании проблемы производительности.

Если ранее вы использовали DOMSubtreeModified, следует знать, что несмотря на его удобство, такое использование могло приводить к ухудшению производительности.

С MutationObserver стоит использоваться ответственно: ограничивайте область отслеживания специфическими селекторами и отключайте наблюдение, когда оно становится ненужным — это способствует повышению эффективности работы.

Расширенные возможности jQuery

Для отслеживания совершаемых с помощью html() в jQuery изменений, можно расширить прототип jQuery следующим образом:

JS
Скопировать код
(function($) {
  const originalHtml = $.fn.html;
  $.fn.html = function() {
    const result = originalHtml.apply(this, arguments);
    if(arguments.length) {
      $(this).trigger('contentchanged');
    }
    return result;
  };
}(jQuery));

$('#watchedElement').on('contentchanged', function() {
  console.log('Содержимое изменилось! Время действовать!');
});

Такое расширение помогает интегрировать пользовательское событие в экосистему jQuery, значительно облегчая отслеживание изменений.

Мониторинг изменений в реальном времени

Для регулярной проверки элементов на наличие изменений можно использовать setInterval:

JS
Скопировать код
setInterval(() => {
  // Проверка элемента на изменения...
}, 1000);

Сочетание MutationObserver и периодической проверки дает возможность точно и своевременно определять определенные изменения.

Для отслеживания изменений, связанных с хешем адреса и навигацией страниц, можно использовать события hashchange или popstate:

JS
Скопировать код
window.addEventListener('hashchange', () => {
  // Реагирование на изменения хеша адреса
});

window.addEventListener('popstate', () => {
  // Отслеживание навигации в браузере
});

Использование библиотек: mutation-summary

Применение библиотеки mutation-summary облегчает фильтрацию мутаций и предоставляет детализированные отчёты о добавленных и удалённых элементах:

JS
Скопировать код
const summaryObserver = new MutationSummary({
  callback: (summaries) => {
    summaries.forEach(summary => {
      const addedElements = summary.added;
      // Обработка добавленных элементов
    });
  },
  queries: [{ element: 'div' }]
});

Благодаря возможности составления запросов, данная библиотека упрощает обработку изменений.

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

Вы можете представить DOM как сад, а MutationObserver — как сачок для бабочек, которые появляются при возникновении изменений в DOM:

Markdown
Скопировать код
Сад (DOM)
|
| -- Появление нового цветка (добавление элемента)
| -- Увядание цветка (удаление элемента)
| -- Цветок меняет окраску (изменение атрибута)

С помощью нашего "сачка" можно зафиксировать эти изменения в реальном времени.

Преодоление препятствий совместимости

MutationObserver хорошо поддерживается современными браузерами, но для старых браузеров могут потребоваться полифилы.

Баланс между мощностью и простотой

MutationObserver — мощный инструмент, но иногда для выполнения задачи достаточно простоты jQuery. Например, для отслеживания изменения класса элемента можно использовать событие изменения атрибута через метод .on() в jQuery:

JS
Скопировать код
$('#targetElement').on('attributeChange', function() {
  // Реагирование на изменение атрибута
});

Выбирайте инструмент в зависимости от конкретной задачи: сложный MutationObserver или простой jQuery.

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

  1. MutationObserver — Web APIs | MDN — документация MDN.
  2. MutationObserver API — подробное руководство по использованию API.
  3. Обнаружение изменений в DOM — Stack Overflow — обмен опытом и лучшие практики в сообществе.
  4. DOM Standard — спецификация MutationObservers в живом стандарте DOM.
  5. Mutation observer — детальное руководство по Mutation Observers на JavaScript.info.
  6. DOM MutationObserver – Mozilla Hacks — взгляд Mozilla на использование Mutation Observers.
  7. .on() | Документация jQuery API — официальная документация jQuery для метода .on().