Добавить html к ближайшему div кнопки с указанным классом с помощью javascript jquery

У меня следующая структура 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 с указанным классом?

api.jquery.com/insertAfter
Taplar 06.12.2018 16:09

Вы не хотите добавлять элемент к, но после его

Taplar 06.12.2018 16:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
1 013
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы хотите добавить родственного брата в строку формы, а не в контент. Для этого вы можете использовать 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 сработала, спасибо большое!

Acidon 06.12.2018 17:55

изменить: используйте $(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 или других.

Derek Nguyen 06.12.2018 16:37

небольшое изменение в вашем коде

$(document).on('click', '.add_row', function (e) {
  $(this).closest('.form-row').clone().insertAfter($(this).closest('.form-row'));
});

Другие вопросы по теме