У меня следующая структура HTML:
<div class='form-row'>
<div class='col-2'>
Blah Blah
</div>
<div class='col-4'>
<button type='button' class='add_row'>+</button>
</div>
</div>
При нажатии кнопки add_row мне нужно добавить еще один блок form-row рядом с ближайшим к кнопке блоком form-row, поэтому результат будет таким:
<div class='form-row'>
<div class='col-2'>
Blah Blah
</div>
<div class='col-4'>
<button type='button' class='add_row'>+</button>
</div>
</div>
<div class='form-row'>
<div class='col-2'>
Blah Blah
</div>
<div class='col-4'>
<button type='button' class='add_row'>+</button>
</div>
</div>
Я пробовал использовать скрипт jQuery:
$(document).on('click', '.add_row', function () {
$(this).closest('.form-row').append("<div class='form-row'>div contents</div>");
});
Но он добавляет его ПОСЛЕ прямого родительского элемента кнопки (<div class='col-4'>).
Каков правильный jquery для добавления в ближайший div с указанным классом?
Вы не хотите добавлять элемент к, но после его



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы хотите добавить родственного брата в строку формы, а не в контент. Для этого вы можете использовать insertAfter() или after().
$(document.body).on('click', '.add_row', function (e) {
$(e.target).closest('.form-row').after('<div class = "form-row">Content</div>');
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='form-row'>
<div class='col-2'>
Blah Blah
</div>
<div class='col-4'>
<button type='button' class='add_row'>+</button>
</div>
</div>
<div class='form-row'>
<div class='col-2'>
Blah Blah
</div>
<div class='col-4'>
<button type='button' class='add_row'>+</button>
</div>
</div>Замена append на after сработала, спасибо большое!
изменить: используйте $(el).after(), например, @Taplar. Обновленный код ниже
Когда вы делаете $(el).append(...), вы добавляете в $(el).
Вы хотите добавить к родительскому элементу $(el), также известному как $(el).parent().
$(function() {
$(document).on('click', '.add_row', function () {
$(this).closest('.form-row').after("<div class='form-row'>div contents</div>");
});
});
Обратите внимание: если вы хотите скопировать .form-row, вам необходимо клонировать его перед добавлением.
$(function() {
$(document).on('click', '.add_row', function () {
const $formRow = $(this).closest('.form-row');
$formRow.parent().after($formRow.clone());
});
});
Vanilla Javascript, для справки:
const $formRow = document.querySelector('.form-row');
document.onclick = (e) => {
if (!e.target.classList.contains('add_row')) return;
$container.after($formRow.cloneNode(true));
};
@Taplar, ты прав, я пропустил это, спасибо! Я обновил свой ответ, так как он все еще может быть полезен для op или других.
небольшое изменение в вашем коде
$(document).on('click', '.add_row', function (e) {
$(this).closest('.form-row').clone().insertAfter($(this).closest('.form-row'));
});