Как разместить несколько добавленных значений полей ввода с помощью ajax

#javascript #jquery #arrays #ajax #append

Вопрос:

Итак, я пытаюсь предоставить пользовательский интерфейс в HTML-страницу, в которой пользователь может ввести число в поле ввода и нажмите применить (используя addRowsForm), чтобы увидеть ряды различных полей ввода, которые прилагаются к другой отдельной форме (по имени createRecordForm) и потом подавать эту форму (в том числе всех тех, кто приложил входа и два других скрытых полей) с помощью AJAX.

Моя проблема в том, что я не могу найти способ сгруппировать данные и опубликовать их из-за непредсказуемого количества полей ввода, которые будут добавлены в зависимости от взаимодействия пользователя со страницей. Мы очень ценим вашу помощь.

Вот мои коды:

Форма добавления

 lt;form action="#" name="addRowsForm" id="addRowsForm" method="post"gt;  lt;div class="form-group"gt;  lt;input type="number" min="1" max="10" name="addRowCounter" id="addRowCounter"gt;  lt;/divgt;  lt;button type="submit" name="applyBtn" id="applyBtn"gt;Applylt;/buttongt; lt;/formgt;  

Форма записи для создания

 lt;table class="table table-bordered table-striped table-sm"gt;  lt;thead class="bg-brand-4th-color"gt;  lt;thgt;Link Typelt;/thgt;  lt;thgt;Linklt;/thgt;  lt;thgt;Recorded Timelt;/thgt;  lt;thgt;Video Visibilitylt;/thgt;  lt;/theadgt;  lt;form action="" method="POST" name="createRecordForm" id="createRecordForm"gt;  lt;input type="hidden" name="ats_id" value="{{atsIdForFrag}}"gt;  lt;input type="hidden" name="tot_rows" value=""gt;  lt;tbody id="tBody"gt;  lt;/tbodygt;  lt;tfootgt;  {# submit btn #}  lt;trgt;  lt;td colspan="4"gt;  lt;div class="form-group"gt;  lt;button class="btn btn-success" type="submit" name="create_recorded_session_btn" id="create_recorded_session_btn"gt;Createlt;/buttongt;  lt;/divgt;  lt;/tdgt;  lt;/trgt;   lt;/tfootgt;  lt;/formgt; lt;/tablegt;  

Часть Javascript:

 lt;scriptgt;  $( document ).ready(  function(){  $("#addRowsForm").on("submit", function(e) {  e.preventDefault();  var rowCounter = $("input[name=addRowCounter]").val();  $("input[name=tot_rows]").val(rowCounter);  //reset any previous content  $("#tBody").html('');  for (var i = 1; i lt;= rowCounter; i  )   {  var newRowContent =   "lt;trgt;lt;tdgt;lt;div class='form-group p-0 m-0'gt;lt;select class='form-control' name='link_type_row_" i "' requiredgt;lt;option value='google_drive' selectedgt;Google Drivelt;/optiongt;lt;/selectgt;lt;/divgt;lt;/tdgt;lt;tdgt;lt;div class='form-group p-0 m-0'gt;lt;input class='form-control' type='text' name='link_row_" i "' value='' requiredgt;lt;/divgt;lt;/tdgt;lt;tdgt;lt;div class='form-group p-0 m-0'gt;lt;input type='datetime-local' name='datetime_row_" i "' class='form-control' required/gt;lt;/divgt;lt;/tdgt;lt;tdgt;lt;div class='form-check'gt;lt;input class='form-check-input' type='radio' name='visibilityRadio_row_" i "' id='showOption_row_" i "' value='show'gt;lt;label class='form-check-label' for='showOption_row_" i "'gt;Show to studentlt;/labelgt;lt;/divgt;lt;div class='form-check'gt;lt;input class='form-check-input' type='radio' name='visibilityRadio_row_" i "' id='dontShow_row_" i "' value='dont_show'gt;lt;label class='form-check-label' for='dontShow_row_" i "'gt;Don't show to studentlt;/labelgt;lt;/divgt;lt;/tdgt;lt;/trgt;";  $("#tBody").append(newRowContent);  }    $("#createRecordForm").on("submit", function(e) {  e.preventDefault();    var ats_id = $("input[name=ats_id]").val();  var tot_rows = $("input[name=tot_rows]").val();    // here is my broblem, I need to change this hard-coded lines into dynamic data and process it in php  var link_type_row_1 = $("select[name=link_type_row_1]").val();  var link_row_1 = $("input[name=link_row_1]").val();  var datetime_row_1 = $("input[name=datetime_row_1]").val();  var visibilityRadio_row_1 = $("input[name=visibilityRadio_row_1]:checked").val();    var link_type_row_2 = $("select[name=link_type_row_2]").val();  var link_row_2 = $("input[name=link_row_2]").val();  var datetime_row_2 = $("input[name=datetime_row_2]").val();  var visibilityRadio_row_2 = $("input[name=visibilityRadio_row_2]:checked").val();    var url = "{{ path('ao__frg_persist_st_rec_session')|escape('js') }}";  var type = "POST";    $.ajax({  url : url,  type: type,  data : {  'ats_id': ats_id,  'tot_rows': tot_rows,    'link_type_row_1': link_type_row_1,  'link_row_1': link_row_1,  'datetime_row_1': datetime_row_1,  'visibilityRadio_row_1': visibilityRadio_row_1,    'link_type_row_2': link_type_row_2,  'link_row_2': link_row_2,  'datetime_row_2': datetime_row_2,  'visibilityRadio_row_2': visibilityRadio_row_2  },    success: function(returnedMsg) {  // do something  }  });   });   });   });  lt;/scriptgt;  

[UPDATE : Check my answer below this paragraph] If I implement the batch approach as suggested by @Kinglish, I will end up having a big single radio while each row should have its own radio input separately from the rest. html form

[РЕШЕНИЕ ПРОБЛЕМЫ С ОБНОВЛЕНИЕМ ВЫШЕ] Поэтому я использовал номер индекса цикла, чтобы сохранить уникальное имя и идентификатор для радиовходов каждой строки. Теперь строка 1 имеет входное имя/идентификатор visibility_radio_row_1, а имя/идентификатор 2-й строки-visibility_radio_row_2. Затем я использовал селектор подстановочных знаков ^ и свойство :проверено, чтобы указать значение проверенного радио в каждой строке независимо от других строк.

 let obj = [];  $('.data-group').each(function() {  obj.push({  link_type: $(this).find('select[name="link_type_row"]').val(),  link: $(this).find('input[name="link_row"]').val(),  created_at: $(this).find('input[name="datetime_row"]').val(),  is_active: $(this).find('input[name^="visibilityRadio_row"]:checked').val()  })  })  

Ответ №1:

Я бы подошел к этому по-другому. Учтите, что вы можете обрабатывать их пакетами, а не конечным циклом. Не переписывая свой сценарий, посмотрите, как они обрабатываются. в итоге вы получаете массив объектов, которые отображаются в том порядке, в каком они находятся в вашей форме. Это избавляет от необходимости добавлять число в каждое поле. В удаленном скрипте, который их получает, вы можете просто просмотреть их и, при желании, добавить номер в этот момент.

 $(document).ready(function() {  $('.submit').click(function() {  let obj = [];  $('.data-group').each(function() {  obj.push({  name: $(this).find('input[name="name"]').val(),  gender: $(this).find('select[name="gender"]').val(),  favorite_color: $(this).find('input[name="favorite_color"]').val()  })  })  console.log('obj:', obj);  }) })  // I accidentally did this in vanillaJS first, so for posterity, here is that version: /* window.addEventListener('DOMContentLoaded', () =gt; {  document.querySelector('.submit').addEventListener('click', () =gt; {  let obj = [];  document.querySelectorAll('.data-group').forEach(e =gt; {  obj.push({  name: e.querySelector('input[name="name"]').value,  gender: e.querySelector('select[name="gender"]').value,  favorite_color: e.querySelector('input[name="favorite_color"]').value  })  })  console.log('obj:', obj);  }) }) */ 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"gt;lt;/scriptgt; lt;div class='data-group'gt;  lt;input name='name' value='john' /gt;  lt;select name='gender'gt;  lt;option selected value='this'gt;thislt;/optiongt;  lt;option value='that'gt;thatlt;/optiongt;  lt;option value='other'gt;otherlt;/optiongt;  lt;/selectgt;  lt;input name='favorite_color' value='blue' /gt; lt;/divgt;   lt;div class='data-group'gt;  lt;input name='name' value='mary' /gt;  lt;select name='gender'gt;  lt;option value='this'gt;thislt;/optiongt;  lt;option value='that' selectedgt;thatlt;/optiongt;  lt;option value='other'gt;otherlt;/optiongt;  lt;/selectgt;  lt;input name='favorite_color' value='green' /gt; lt;/divgt; lt;hrgt; lt;button class='submit'gt;clicklt;/buttongt; 

Комментарии:

1. Спасибо за ответ. Я смог применить ваш подход, и я почти на месте. Итак, мне нужно было изменить разметку добавления и избавиться от $i как способа создания уникальных идентификаторов, и я добавил класс-оболочку «группа данных» в lt;trgt;. Теперь проблема в том, что все созданные строки будут иметь один переключатель, в то время как каждая строка должна оставаться независимой. Есть идеи?