Umbrella JS предоставляет удобные методы для работы с DOM, включая возможность клонирования элементов. Клонирование часто требуется при создании динамических интерфейсов, дублировании шаблонов или копировании элементов с сохранением их структуры и событий.
clone()Основной метод для клонирования элементов — clone(). Он
возвращает новый объект Umbrella JS, содержащий копии выбранных
элементов. Синтаксис:
u('селектор').clone([withEvents = false]);
true, все обработчики событий исходного элемента также
будут скопированы.По умолчанию clone() копирует только структуру DOM,
атрибуты и содержимое элемента, но не события:
let clone = u('.item').clone();
u('body').append(clone);
В этом примере .item будет скопирован и добавлен в конец
<body>. Любые привязанные события не будут
перенесены.
Для полного клонирования с обработчиками событий используется
параметр true:
let cloneWithEvents = u('.item').clone(true);
u('#container').append(cloneWithEvents);
Все события, включая click, input и
кастомные, будут продублированы в новом элементе.
Umbrella JS поддерживает работу с коллекцией элементов. Если селектор
выбирает несколько элементов, метод clone() создаст
отдельную копию для каждого элемента:
let clones = u('.card').clone();
u('#cards-container').append(clones);
Каждый .card будет скопирован отдельно и вставлен в
#cards-container.
Элементы <input>, <textarea> и
<select> при обычном клонировании теряют текущее
значение. Чтобы сохранить данные форм, требуется дополнительная
обработка:
u('.form-field').each(function(el) {
let cloned = u(el).clone();
if (el.value) cloned[0].value = el.value;
u('#form-clones').append(cloned);
});
Этот подход позволяет клонировать поля формы с сохранением введённых пользователем данных.
Метод clone() по умолчанию выполняет глубокое
клонирование. Это означает, что все дочерние элементы,
вложенные теги и текст внутри исходного элемента будут скопированы:
let nestedClone = u('.menu').clone();
Если .menu содержит вложенные <ul> и
<li>, они полностью дублируются.
on() на
родителе), не требуют клонирования с true, так как
делегирование работает на уровне родителя.id дублируются, что может привести к
конфликтам в DOM. Рекомендуется корректировать id после
клонирования:u('.widget').clone().each(function(el, i) {
el.id = 'widget-' + i;
});
<canvas> содержимое графики не
копируется автоматически; требуется ручное перенесение контекста.Клонирование удобно комбинировать с другими методами библиотеки:
u('.card').clone(true).addClass('cloned').appendTo('#cards-container');
В этом примере элемент клонируется с событиями, получает
дополнительный класс cloned и вставляется в контейнер.
Такой подход позволяет создавать динамические, интерактивные интерфейсы
с минимальным количеством кода.
Клонирование в Umbrella JS — мощный инструмент для управления DOM, позволяющий создавать новые элементы на основе существующих с сохранением структуры, стилей и событий, обеспечивая гибкость и масштабируемость интерфейсов.