Клонирование элементов — один из базовых инструментов работы с DOM,
который позволяет создавать точные копии существующих элементов вместе с
их содержимым и атрибутами. В Zepto.js для этих целей используется метод
clone(), аналогичный одноимённому методу в jQuery, но с
особенностями оптимизации для лёгкого размера библиотеки.
clone()Синтаксис:
$(selector).clone([withDataAndEvents])
Параметры:
withDataAndEvents (необязательный, булевый) —
если true, вместе с элементом будут скопированы все
обработчики событий, привязанные через Zepto. По умолчанию
false.Возвращаемое значение: Новая коллекция Zepto с клонированными элементами.
Пример базового клонирования:
var original = $('#myDiv');
var copy = original.clone();
$('body').append(copy);
В этом примере элемент с id myDiv будет продублирован в
конец документа. Копия не будет содержать обработчики
событий, если не указано иначе.
Zepto позволяет копировать элементы вместе с событиями. Это особенно полезно при динамическом создании интерфейсов с повторяющимися компонентами.
$('#button').on('click', function() {
alert('Нажали кнопку');
});
var clonedButton = $('#button').clone(true);
$('body').append(clonedButton);
В этом случае клон кнопки будет реагировать на клик так же, как
оригинал. Если параметр true не указан, клон останется
«мёртвым» в плане событий.
Метод clone() по умолчанию копирует весь
внутренний HTML, включая вложенные элементы и их атрибуты.
Пример:
var list = $('#myList');
var clonedList = list.clone();
$('#container').append(clonedList);
Если элемент содержит сложную структуру с ul →
li → span, вся иерархия будет сохранена.
Обработчики событий для вложенных элементов не
копируются, если явно не указан параметр true.
События, привязанные через addEventListener
напрямую, не клонируются. Только события, зарегистрированные
через Zepto (.on, .bind) могут быть
дублированы при использовании clone(true).
Данные, привязанные через $.data(), могут
быть не полностью скопированы. Метод clone(true)
сохраняет только внутренние данные, связанные с событиями
Zepto.
Работа с формами. Значения полей форм, таких как
<input>, <textarea>,
<select>, не всегда корректно
клонируются. Для сохранения состояния следует вручную присвоить
значения:
var input = $('#textInput');
var clonedInput = input.clone();
clonedInput.val(input.val());
1. Динамическое создание повторяющихся блоков:
var template = $('#cardTemplate').clone();
template.find('.title').text('Новая карточка');
$('#cardsContainer').append(template);
2. Сохранение обработчиков при дублировании интерфейсов:
$('#item').on('mouseover', function() {
$(this).addClass('highlight');
});
var clone = $('#item').clone(true);
$('#itemsContainer').append(clone);
3. Генерация элементов с сохранением состояния событий и атрибутов:
var row = $('#tableRow');
var newRow = row.clone(true);
newRow.find('input').val(''); // очищаем поля
$('#tableBody').append(newRow);
true,
если событий много — это замедляет рендер.Клонированные элементы чаще всего вставляются в DOM через:
.append().prepend().after().before()Пример комбинированного использования:
var template = $('#itemTemplate').clone();
template.find('.name').text('Иван');
$('#list').append(template);
Метод clone() гарантирует, что оригинальный шаблон
остаётся нетронутым, позволяя многократно создавать копии с разными
данными.
Клонирование в Zepto является лёгким, гибким и мощным инструментом для работы с повторяющимися DOM-структурами и динамическим интерфейсом, сохраняя баланс между производительностью и удобством управления событиями.