Замена элементов

Dom7 — это лёгкая и мощная библиотека для работы с DOM, которая используется в основном во фреймворке Framework7, но может применяться и отдельно. Одним из ключевых аспектов работы с DOM является замена элементов, что позволяет динамически управлять структурой страницы без перезагрузки.

Методы замены элементов

Dom7 предоставляет несколько методов для замены элементов, которые основаны на внутренней обёртке над стандартными DOM-операциями.

1. .replaceWith()

Метод .replaceWith() заменяет каждый выбранный элемент на указанный HTML, текст или другой элемент. Основные особенности:

  • Можно передавать строку HTML, объект Dom7, DOM-элемент или массив элементов.
  • Замена выполняется для каждого элемента в выборке.
  • При передаче строки HTML она автоматически парсится в элементы.

Примеры использования:

// Замена одного элемента на новый div
$('.old-element').replaceWith('<div class="new-element">Новый контент</div>');

// Замена с использованием другого Dom7-объекта
var newElem = $('<span>Заменяемый текст</span>');
$('.old-element').replaceWith(newElem);

// Замена на существующий DOM-элемент
var domElem = document.createElement('p');
domElem.textContent = 'Текст параграфа';
$('.old-element').replaceWith(domElem);

Важно помнить, что после вызова .replaceWith() исходный элемент удаляется из DOM и больше не доступен через прежние ссылки.

2. .replaceAll()

Метод .replaceAll() позволяет заменить целевую группу элементов на выбранный элемент или элементы, противоположно .replaceWith(), где замена идёт из контекста выбранного элемента.

Синтаксис и особенности:

  • Выбранный элемент или набор элементов заменяет все элементы, соответствующие селектору.
  • Поддерживаются строки HTML, объекты Dom7, массивы элементов и одиночные DOM-узлы.

Пример:

// Все элементы с классом old заменяем на новый div
$('<div class="new"></div>').replaceAll('.old');

Работа с множественными элементами

Dom7 автоматически применяет замену ко всем элементам выборки. Например, если выбрать несколько элементов по классу и использовать .replaceWith():

$('.item').replaceWith('<div class="item-replacement">Новый элемент</div>');

Каждый элемент .item будет заменён на новый <div> с классом item-replacement. Если необходимо, чтобы каждый старый элемент заменялся уникальным новым элементом, можно использовать функцию в качестве аргумента:

$('.item').replaceWith(function(index, oldHtml) {
  return `<div class="item-${index}">Элемент ${index}</div>`;
});

В этом случае каждому элементу присваивается индивидуальный контент на основе его индекса.

Замена с сохранением событий

Стандартная замена элементов приводит к удалению всех привязанных событий. Для сохранения событий требуется либо переносить их вручную, либо использовать делегирование событий через .on(). Прямой метод Dom7 для автоматического клонирования событий отсутствует, поэтому для динамически создаваемых элементов рекомендуется делегировать события на родительский контейнер:

// Делегирование вместо прямого назначения события
$('.container').on('click', '.item', function() {
  console.log('Нажат элемент');
});

После замены элемента делегированное событие остаётся активным, так как оно привязано к родителю.

Замена текста и HTML внутри элементов

Dom7 позволяет не только заменять целый элемент, но и изменять содержимое через методы .html() и .text():

// Замена HTML-контента
$('.item').html('<strong>Новый HTML</strong>');

// Замена текста
$('.item').text('Новый текст');

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

Особенности работы с атрибутами при замене

При замене элементов важно учитывать, что все атрибуты старого элемента теряются. Для переноса атрибутов можно предварительно скопировать их:

$('.old').each(function(index, el) {
  var attrs = el.attributes;
  var newEl = $('<div>Новый элемент</div>')[0];
  for (var i = 0; i < attrs.length; i++) {
    newEl.setAttribute(attrs[i].name, attrs[i].value);
  }
  $(el).replaceWith(newEl);
});

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

Рекомендации по производительности

  • Для массовой замены большого числа элементов лучше формировать новые элементы в DocumentFragment и заменять пакетно, чтобы снизить количество операций с DOM.
  • Использование функций в .replaceWith() помогает динамически создавать элементы без дополнительного цикла.
  • Делегирование событий сокращает накладные расходы на повторное назначение обработчиков после замены элементов.

Взаимодействие с другими методами Dom7

Методы замены удобно комбинировать с другими методами Dom7, такими как .append(), .prepend(), .after(), .before(). Например, можно сначала вставить новый элемент после старого, а затем удалить старый, если требуется сложная логика замены с анимацией.

$('.old-item').after('<div class="new-item">Вставленный элемент</div>').remove();

Такой подход позволяет создавать плавные анимации перехода и минимизировать перерисовку страницы.