Выполнять операции на клонированной форме - PullRequest
0 голосов
/ 12 февраля 2020

Я создал форму, которая содержит два раскрывающихся списка, когда пользователь выбирает элемент из первого списка, данные для второго автоматически обновляются. Для этого я использую jquery, и он отлично работает, за исключением того, что когда я дублирую форму, раскрывающийся список № 1 дублированной формы больше не обновляет раскрывающийся список № 2, поэтому я хотел бы знать, как могу ли я выполнить то же действие с клонированной формой (обновить раскрывающийся список, выбрав одну введенную в другой) и сохранить записи всех клонированных форм в базе данных.

Cordially!

вот код, который я использую

<form id="myForm">
 <div id="clonedSection1" class="clonedSection">    
  <select class="form-control" name="productName[]" id="productName" >
   <option value="0" selected>Selectionner le produit</option>
   <option value="copy">Copie</option>
   <option value="scan">Scan</option>
  </select>
  <select class="form-control" name="productPrice[]" id="quant" disabled>
   <option value="pu" selected>P.U</option>
  </select>
</div>
<div>
 <input type="button" id="btnAdd" value="add another name" />
 <input type="button" id="btnDel" value="remove name" />
</div>

<!-- script that allows you to modify the data in a drop-down list when an item is selected in another-->
<script type="text/javascript">
 $("#productName").change(function () {
  var val = $(this).val();
  if (val == "copy") {
  $("#quant").html("<option value='25'> 25$ </option>");
 } else if (val == "scan") {
  $("#quant").html("<option value='50'> 10$ </option>");
 }
});
</script>

<!-- script that clones the form-->
<script type="text/javascript">
 $(document).ready(function() {
 $("#btnAdd").click(function() {
  var num = $(".clonedSection").length;
  var newNum  = new Number(num + 1);

  var newSection = $("#clonedSection" + num).clone().attr("id", "clonedSection" + newNum);
  newSection.children(":nth-child(5)").children(":first").attr("id", "productName" + newNum).attr("name", "productName[]" + newNum);
  newSection.children(":nth-child(6)").children(":first").attr("id", "quant" + newNum).attr("name", "productPrice[]" + newNum);

  $(".clonedSection").last().append(newSection)
  $("#btnDel").attr("disabled","");

  });
  $("#btnDel").click(function() {
  var num = $(".clonedSection").length; // how many "duplicatable" input fields we currently have
        $("#clonedSection" + num).remove();     // remove the last element

        // enable the "add" button
        $("#btnAdd").attr("disabled","");

        // if only one element remains, disable the "remove" button
        if (num-1 == 1)
            $("#btnDel").attr("disabled","disabled");
    });

    $("#btnDel").attr("disabled","disabled");
  });
</script>

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Я написал простой и понятный код.

Выполните следующие шаги:

  1. Не используйте ID, так как вам нужно использовать имя класса вместо идентификатора, поскольку ID должен быть уникальным.
  2. Если добавляется динамически, тогда необходимо использовать .on() вместо .change() метода.
  3. .cloned-section section должен быть отделен от Add Button.
  4. Каждый раз выбирать clone element с помощью .cloned-section>div:nth-child(1) этого nth-child метода.
  5. Установить значение в поле ввода с помощью onchange .product-name class.
  6. Удалить элемент с помощью onclick .btn-remove class.
  7. Если добавить элемент клонирования методом append(), тогда select + input значения должны установить null, чтобы вы могли видеть в моем jQuesy код, а также см. закомментированный текст.


Надеюсь, приведенный ниже фрагмент поможет вам.

$(document).on('click', '#btnAdd', function(){
  // Make clone by clone() method and append REMOVE button for remove section
  var cloneElement = $('.cloned-section>div:nth-child(1)').clone();
      cloneElement.append('<button type="button" class="btn btn-danger btn-remove"><span aria-hidden="true">&times;</span></button>');
  // Select value set Zero (0)
  cloneElement.find('select').val(0);
  // Input value set empty
  cloneElement.find('input').val('');
  $('.cloned-section').append(cloneElement);
});

// On change product name then set price on price field
$(document).on('change', '.product-name', function(){
  var getValue = $(this).val();
  $(this).parent().find('.product-price').val(getValue+'%');
});

// Click on Remove button and delete product/price section
$(document).on('click', '.btn-remove', function(){
  $(this).parent().remove();
});
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/css/bootstrap.min.css">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<div class="container my-2">
  <div class="row">
    <div class="col-sm-12">
      <form class="form-inline" id="myForm">
        <div class="cloned-section w-100">
          <div class="w-100 mt-2">    
            <select class="form-control w-50 product-name" name="productName[]">
              <option value="0" selected>Select Product</option>
              <option value="25">Copy</option>
              <option value="50">Scan</option>
              <option value="75">Paste</option>
              <option value="100">Cut</option>
           </select>
           <input class="form-control w-25 product-price text-center" name="productPrice[]" readonly>
         </div>
       </div>
      <div class="w-100 mt-2">
        <button type="button" id="btnAdd" class="btn btn-success">Add Another Name</button>
      </div>
    </form>
   </div>
  </div>
</div>
0 голосов
/ 12 февраля 2020

В вашем коде есть небольшие проблемы:

  • Используйте имя класса вместо id для элементов DOM, которые будут клонированы. Это потому, что идентификатор уникален. Разные элементы не должны иметь один и тот же идентификатор. Если вы клонируете элемент с идентификатором, будут элементы с одинаковым идентификатором.
  • Используйте .on() вместо .change() для элементов, которые генерируются динамически.
  • Я не уверен, если Вы действительно хотите вставить новый "clonedSection" внутри последнего "clonedSection". Если вы не собираетесь этого делать и хотите вставить новый «clonedSection» сразу после последнего «clonedSection», используйте newSection.insertAfter($(".clonedSection").last());
  • значение .attr("disabled", <>) должно быть либо true, либо false , но не "" и disabled

$(document).ready(function() {

	//use on() instead of change() for elements that generate dynamically
  $("body").on("change", ".productName", function() { 
    var _this = $(this);
    var quant = _this.closest(".clonedSection").find(".quant");
    var val = _this.val();
    if (val == "copy") {
      quant.html("<option value='25'> 25$ </option>");
    } else if (val == "scan") {
      quant.html("<option value='50'> 10$ </option>");
    }
  });
  
  $("#btnAdd").click(function() {
    var num = $(".clonedSection").length;
    var newNum = num + 1;

    var newSection = $("#clonedSection" + num).clone().attr("id", "clonedSection" + newNum);
    newSection.children(":nth-child(5)").children(":first").attr("id", "productName" + newNum).attr("name", "productName[]" + newNum);
    newSection.children(":nth-child(6)").children(":first").attr("id", "quant" + newNum).attr("name", "productPrice[]" + newNum);

		newSection.insertAfter($(".clonedSection").last()); //insert right after the last clonedsection
    $("#btnDel").attr("disabled", false); //disabled should be either true/false but not ""

  });
  $("#btnDel").click(function() {
    var num = $(".clonedSection").length;
    $("#clonedSection" + num).remove();
    $("#btnAdd").attr("disabled", false);
    if (num - 1 == 1)
      $("#btnDel").attr("disabled", true);
  });

  $("#btnDel").attr("disabled", true);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="myForm">
<!--If you are going to clone DOM element, please use classname instead of id-->
 <div id="clonedSection1" class="clonedSection">   
  <select class="form-control productName" name="productName[]">
   <option value="0" selected>Selectionner le produit</option>
   <option value="copy">Copie</option>
   <option value="scan">Scan</option>
  </select>
  <select class="form-control quant" name="productPrice[]">
   <option value="pu" selected>P.U</option>
  </select>
</div>
<div>
 <input type="button" id="btnAdd" value="add another name" />
 <input type="button" id="btnDel" value="remove name" />
</div>

Надеюсь, эта помощь: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...