Динамическое создание элементов формы используется для адаптивных интерфейсов: появление дополнительных полей при вводе данных, построение таблиц конфигураций, генерация повторяющихся блоков и др. jQuery ускоряет эти операции за счёт удобной работы с DOM, шаблонированием и обработчиками событий.
Элемент создаётся как jQuery-объект, после чего может настраиваться и только затем добавляться в документ.
<div id="container"></div>
var input = $('<input>', {
type: 'text',
name: 'item[]',
class: 'dynamic-input'
});
$('#container').append(input);
Такой подход позволяет установить атрибуты, классы и даже обработчики до появления элемента на странице, что снижает количество перерисовок.
Иногда требуется создавать группы элементов. Например, текстовое поле и кнопка для удаления.
function createField() {
var wrapper = $('<div>', { class: 'field-row' });
var input = $('<input>', { type: 'text', name: 'value[]' });
var remove = $('<button>', { type: 'button', text: 'Удалить' });
remove.on('click', function () {
wrapper.remove();
});
wrapper.append(input, remove);
return wrapper;
}
$('#add').on('click', function () {
$('#container').append(createField());
});
Использование обёртки упрощает управление позиционированием и удалением.
Добавленные позднее элементы не всегда унаследуют обработчики, навешанные ранее, поэтому применяется делегирование.
$('#container').on('input', '.dynamic-input', function () {
// обработка изменений
});
Делегирование повышает устойчивость интерфейса при частом добавлении и удалении вложенных элементов.
При сложных структурах удобнее генерировать фрагменты на основе строковых шаблонов.
var tpl = `
<div class="contact">
<input type="text" name="phone[]" placeholder="Телефон">
<input type="text" name="email[]" placeholder="Email">
</div>
`;
$('#add-contact').on('click', function () {
$('#contacts').append($(tpl));
});
Шаблоны уменьшают количество вызовов конструктора jQuery и повышают читаемость кода.
jQuery предоставляет гибкие методы вставки. Для динамических форм
часто используется before, after и
replaceWith.
$('<input type="text" name="comment">').insertAfter('#title');
Выбор метода определяет позицию будущего элемента без дополнительных проверок DOM.
При получении данных с сервера формируется набор полей, соответствующий структуре ответа.
var values = ['Москва', 'Казань', 'Томск'];
values.forEach(function(city) {
$('#cities').append(
$('<input>', { type: 'text', name: 'cities[]', value: city })
);
});
Подход удобен для редактирования существующих объектов.
Динамические поля обычно собираются в массивы, поэтому
name="item[]" является распространённым приёмом. При
необходимости точной нумерации выполняется переиндексация после операций
удаления.
function reindex() {
$('#container .field-row').each(function(i) {
$(this).find('input').attr('name', 'value[' + i + ']');
});
}
Переиндексация обеспечивает корректное связывание на сервере.
Через jQuery одинаково создаются текстовые поля, select,
textarea, чекбоксы и другие элементы. Важный момент —
установка специфичных атрибутов (multiple,
checked, disabled, data-*).
$('<select>', { name: 'color', multiple: true })
.append('<option value="red">Красный</option>')
.append('<option value="blue">Синий</option>')
.appendTo('#colors');
Унифицированный интерфейс снижает когнитивные затраты при разработке.
При динамическом создании иногда требуется управлять порядком полей. jQuery допускает сортировку узлов, перестановку и анимацию.
var first = $('#container .field-row').first();
$('#container').append(first);
Манипуляции такого рода позволяют реализовать интерфейсы типа drag-and-drop или списки приоритетов.
Удаление отличается от очистки данных. Для полного удаления
используется .remove(), для очистки
.val('').
$('.clear-all').on('click', function () {
$('#container input').val('');
});
Разделение операций предотвращает потерю структуры формы.
Для массового создания элементов предпочтительна агрегация в
DocumentFragment или обычный контейнер в памяти, а затем
единичная вставка в DOM.
var fragment = $(document.createDocumentFragment());
for (var i = 0; i < 50; i++) {
fragment.append($('<input>', { type: 'text', name: 'row[]' }));
}
$('#bulk').append(fragment);
Способность работать с большими объёмами данных без заметных задержек повышает отзывчивость интерфейса.
Динамически добавленные поля включаются в валидацию только после появления в DOM. При использовании внешних плагинов валидации они часто требуют ручного обновления или регистрации новых узлов.
jQuery позволяет анимировать добавление и удаление полей для повышения наглядности интерфейса.
var el = $('<input>', { type: 'text' }).hide();
$('#container').append(el);
el.slideDown(200);
Анимация помогает пользователю сориентироваться при изменении макета формы.
Создание полей выносится в функции, возвращающие jQuery-объекты. Такой приём уменьшает дублирование и упрощает поддержку.
Однотипные элементы формируются единым образом, что позволяет централизованно изменять структуру или атрибуты.
Компактность. Меньше вызовов низкоуровневого DOM-API.
Читаемость. Высокий уровень абстракции.
Расширяемость. Возможность добавлять плагины, шаблоны и дополнительные методы.
Совместимость. Унификация поведения между браузерами, особенно важная для учебных целей и проектов с поддержкой старых окружений.