JQuery: динамически добавлять строки таблицы при нажатии кнопки «Добавить»

У меня есть эта html-форма, где я добавил кнопку для поля Предметы.

<form>
    <table width = "50%" align = "center">
        <tr>
            <td>Amount</td>
            <td><input type = "number" name = "amount" id = "amount" required></td>
        </tr>
        <tr>
            <td>Buyer</td>
            <td><input type = "text" name = "buyer" id = "buyer" maxlength = "255" required></td>
        </tr>
        <tr>
            <td>Receipt Id</td>
            <td><input type = "text" name = "receipt_id" name = "receipt_id" maxlength = "20" required></td>
        </tr>       
        <tr class = "input_fields_wrap">
            <td>Items</td>
            <td><input type = "text" name = "items[]" class = "items" required>&nbsp;<button class = "add_field_button">Add+</button></td>
        </tr>               
        <tr>
            <td>Buyer Email</td>
            <td><input type = "email" name = "buyer_email" id = "buyer_email" required></td>
        </tr>
        <tr>
            <td>Note</td>
            <td><input type = "text" name = "note" id = "note" maxlength = "30" required></td>
        </tr>
        <tr>
            <td>City</td>
            <td><input type = "text" name = "city" id = "city" maxlength = "20" required></td>
        </tr>
        <tr>
            <td>Phone</td>
            <td><input type = "text" name = "phone" id = "phone" required></td>
        </tr>
        <tr>
            <td>Entry By</td>
            <td><input type = "text" name = "entry_by" id = "entry_by" required></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input type = "submit" name = "submit" value = "Recrod Sales"></td>
        </tr>
    </table>
</form>

Теперь я хочу добавить еще одну копию поля элементов после этого поля пункт.

Для этого я использую этот jQuery:

var max_fields      = 10; //maximum input boxes allowed
var wrapper         = $(".input_fields_wrap"); //Fields wrapper
var add_button      = $(".add_field_button"); //Add button ID

var x = 1; //initlal text box count
$(add_button).click(function(e){ //on add input button click
    e.preventDefault();     
    if (x < max_fields){ //max input box allowed
        x++; //text box increment
        var form = '<div><tr><td>Items</td><td><input type = "text" name = "items[]" class = "items" required>&nbsp;<button class = "add_field_button">Add+</button></td></tr><a href = "#" class = "remove_field">Remove</a></div>';
        //$(wrapper).append(form); //add input box
        $(form).after(wrapper);

    }
});

$(wrapper).on("click",".remove_field", function(e){ //user click on remove text
    e.preventDefault(); $(this).parent('div').remove(); x--;
})

но когда я нажимаю эту кнопку добавления (+), она не работает должным образом. Можете ли вы сказать мне, как я могу это сделать?

Спасибо.

Одной из проблем является структура таблицы, она не позволяет вам делать table > div > tr (недействительный table structure). Использование: table > tr > div

Roy Bogado 19.06.2019 09:07

Ах, я не понимаю.

Shibbir 19.06.2019 09:09

var form=... вы добавляете к table недопустимую структуру div > tr > td (items) /td etc... это проблема со структурой. потому что таблица должна быть table > tr > td и внутри элементов <div> и <a>.

Roy Bogado 19.06.2019 09:11

Не имеет прямого отношения к вопросу, но вы не должны использовать здесь таблицы, вы должны использовать только метки, поля ввода и div.

cloned 19.06.2019 09:16

@cloned Я так думаю.

Shibbir 19.06.2019 09:17
Поведение ключевого слова "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
5
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

$(add_button) в вашем коде должен быть add_button, поскольку add_button уже является объектом jQuery.

Примечание: также рекомендуется сохранять объект jQuery с именем переменной, начинающимся с $.

Для добавления элемента вы можете использовать метод clone(), чтобы jQuery не удалял текущий элемент. Вот так:

var max_fields      = 10; //maximum input boxes allowed
var wrapper         = $(".input_fields_wrap").clone(); //Fields wrapper
var add_button      = $(".add_field_button"); //Add button ID

  var x = 1; //initlal text box count
  add_button.click(function(e){ //on add input button click
      e.preventDefault();
      if (x < max_fields){ //max input box allowed
          x++; //text box increment
          var form = $(`
            <div>
              <tr class = "input_fields_wrap"><td>Buyer Email</td><td>
                <input type = "email" name = "buyer_email" id = "buyer_email" required>
              </td></tr>
              <a href = "#" class = "remove_field">Remove</a>
            </div>';
          `)
          //$(wrapper).append(form); //add input box
          $('form').after(wrapper);

      }
  });

Для части удаления нет элемента с классом .remove_field, поэтому сначала изучите его.

Я могу ошибаться, но объект jQuery, который повторно инициализируется как объект jQuery, не дает ошибки.

Wimanicesir 19.06.2019 09:16
Ответ принят как подходящий

Разве простой .insertAfter() не поможет вам? :

const itemHtml = `<tr class = "input_fields_wrap"><td>Items</td><td><input type = "text" name = "items[]" class = "items" required>&nbsp;<button class = "add_field_button">Add+</button></td></tr>`;

$('form').on('click', '.add_field_button', function(event){
  event.preventDefault();
  $(itemHtml).insertAfter($(event.target).closest('tr'));
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><form><table width = "50%" align = "center"><tr><td>Amount</td><td><input type = "number" name = "amount" id = "amount" required></td></tr><tr><td>Buyer</td><td><input type = "text" name = "buyer" id = "buyer" maxlength = "255" required></td></tr><tr><td>Receipt Id</td><td><input type = "text" name = "receipt_id" name = "receipt_id" maxlength = "20" required></td></tr>       <tr class = "input_fields_wrap"><td>Items</td><td><input type = "text" name = "items[]" class = "items" required>&nbsp;<button class = "add_field_button">Add+</button></td></tr>               <tr><td>Buyer Email</td><td><input type = "email" name = "buyer_email" id = "buyer_email" required></td></tr><tr><td>Note</td><td><input type = "text" name = "note" id = "note" maxlength = "30" required></td></tr><tr><td>City</td><td><input type = "text" name = "city" id = "city" maxlength = "20" required></td></tr><tr><td>Phone</td><td><input type = "text" name = "phone" id = "phone" required></td></tr><tr><td>Entry By</td><td><input type = "text" name = "entry_by" id = "entry_by" required></td></tr><tr><td>&nbsp;</td><td><input type = "submit" name = "submit" value = "Recrod Sales"></td></tr></table></form>

попробуй это

var itemHtml='<tr class = "input_fields_wrap">
        <td>Items</td>
        <td><input type = "text" name = "items[]" class = "items" required></td>
        </tr>';

$('.add_field_button').click(function(){
   $(itemHtml).insertAfter($(this).closest('tr'));
});

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