как клонировать форму, включающую отображение текстового поля, зависит от выпадающего списка - PullRequest
0 голосов
/ 21 сентября 2018

У меня проблема с функцией запроса j для отображения текстового поля в зависимости от выпадающего списка, если пользователь выбирает один: отображать «имя и фамилию один раз», если выбрать двойной: отображать «имя и фамилию дважды»,это работает для первого ряда, но не работает с клонированными строками, любой совет, пожалуйста ?? FIDDLE

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function() {
      var genroomid = 2; // change 0 to the number you want to start with
      $(".add-row").click(function() {
        var $clone = $("ul.personal-details").first().clone();
        var $input = $clone.find('#roomid');
        $input.val(genroomid).attr('genroomid', +genroomid) // change fileid with any string you want 
        $clone.append("<button type='button' class='remove-row'>-</button>");
        $clone.insertBefore(".add-row");
        genroomid++; // increase id by 1
      });
      $(".form-style-9").on("click", ".remove-row", function() {
        $(this).parent().remove();
        genroomid--;
      });
      var blkofcod1 = "<select class='stretch' name='prefix[]'><option value='Mr'>Mr</option><option value='Ms'>Ms</option><option value='Child'>Child</option><option value='Infant'>Infant</option></select>";
      var blkofcod2 = "<input  name='fname[]'  type='text' class='stretch' placeholder='First Name' size='15'  maxlength='30' required >&nbsp;<input  name='lname[]' type='text' class='stretch' placeholder='Last Name' size='15' maxlength='30' required  >";
      var blkofcod3 = "<input name='nationality[]'  type='text' placeholder='Nationality' class='stretch' size='15' maxlength='30' required >";
      $('#roomtype').change(function() {
        var value = $(this).val();
        var toAppend = '';
        switch (value) {
          case 'None':
            toAppend = $("#container").html(toAppend);
            return;
            break;
          case 'Single':
            toAppend = blkofcod1 + blkofcod2 + blkofcod3;
            $("#container").html(toAppend);
            return;
            break;
          case 'Double':
            toAppend = blkofcod1 + blkofcod2 + blkofcod3 + "<br>" + blkofcod1 + blkofcod2 + blkofcod3;
            $("#container").html(toAppend);
            return;
            break;
          default:
            toAppend = $("#container").html(toAppend);
            return;
        }
      });

    });
  </script>
</head>

<body>
  <form id="form1">
    <span class="form-style-9">
    <ul class="personal-details">
    <div>
         <select id="roomtype" class="stretch"  name="roomtype[]" required="required">
         <option value="None"> None </option>
       <option value="Single"> Single </option>
         <option value="Double"> Double </option>
        </select>
       <div id="container"></div>

    </div>
    </ul>
    <button type="button" class="add-row">+ New Client</button>
    </span>
  </form>
</body>
</html>

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

С малейшей суммой настройки вашего кода.Из моего понимания вашего вопроса работает следующее:

Объяснение :

$('#roomtype').change(function () {}) стало $(document).on('change', '#roomtype', function() {})

В ответе используются делегированные обработчики событий вJQuery.Этот пункт из документации jQuery объясняет далее.

Обработчики событий связаны только с выбранными в данный момент элементами;они должны существовать в то время, когда ваш код вызывает .on ()

В вашем коде только первое поле выбора существует, когда страница инициализируется, и поэтому любые другие поля выбора добавляются позже (когда нажата кнопка «+ Новый клиент»), они не связаны существующим обработчиком изменений.

Реализация делегированного обработчика события в ответе связывает событие вместо document.Это может быть любой другой элемент DOM, если он существует на момент регистрации обработчика события.

Выбрав элемент, который гарантированно будет присутствовать во время присоединения делегированного обработчика события, выможет использовать делегированные события, чтобы избежать необходимости часто присоединять и удалять обработчики событий.Этот элемент может быть, например, контейнерным элементом представления в модели Model-View-Controller или документом, если обработчик событий хочет отслеживать все всплывающие события в документе.Элемент документа доступен в заголовке документа перед загрузкой любого другого HTML-кода, поэтому можно прикреплять туда события, не дожидаясь готовности документа.

Подробнее читайте здесь: http://api.jquery.com/on/


Во-вторых, другое изменение, необходимое для обеспечения работоспособности кода, заключается в том, как в вашем коде обнаруживается #container.Использование $('#container') searches from the root of the DOM and in this case will almost always find the first element. Changing $ ('# container') to $ (this) .siblings ('# container') finds the closest # container` в измененном поле выбора.

Fiddle: http://jsfiddle.net/5x1Lfedj/15/

$(document).ready(function() {
  var genroomid = 2; // change 0 to the number you want to start with
  $(".add-row").click(function() {
    var $clone = $("ul.personal-details").first().clone();
    var $input = $clone.find('#roomid');
    $input.val(genroomid).attr('genroomid', +genroomid) // change fileid with any string you want 
    $clone.append("<button type='button' class='remove-row'>-</button>");
    $clone.insertBefore(".add-row");
    genroomid++; // increase id by 1
  });


  $(".form-style-9").on("click", ".remove-row", function() {
    $(this).parent().remove();
    genroomid--;
  });

  var blkofcod1 = "<select class='stretch' name='prefix[]'><option value='Mr'>Mr</option><option value='Ms'>Ms</option><option value='Child'>Child</option><option value='Infant'>Infant</option></select>";
  var blkofcod2 = "<input  name='fname[]'  type='text' class='stretch' placeholder='First Name' size='15'  maxlength='30' required >&nbsp;<input  name='lname[]' type='text' class='stretch' placeholder='Last Name' size='15' maxlength='30' required  >";
  var blkofcod3 = "<input name='nationality[]'  type='text' placeholder='Nationality' class='stretch' size='15' maxlength='30' required >";

  $(document).on('change', '#roomtype', function() {
    var value = $(this).val();
    var toAppend = '';
    var $container = $(this).siblings('#container')

    switch (value) {
      case 'None':
        toAppend = $container.html(toAppend);
        return;
        break;

      case 'Single':
        toAppend = blkofcod1 + blkofcod2 + blkofcod3;
        $container.html(toAppend);
        return;
        break;

      case 'Double':
        toAppend = blkofcod1 + blkofcod2 + blkofcod3 + "<br>" + blkofcod1 + blkofcod2 + blkofcod3;
        $container.html(toAppend);
        return;
        break;

      default:
        toAppend = $container.html(toAppend);
        return;
    }
  });

});
0 голосов
/ 21 сентября 2018
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script
  src="https://code.jquery.com/jquery-3.3.1.js"
  integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
  crossorigin="anonymous"></script>
</head>
<body>
    <form>
        <div>
        <select class="dropdown">
            <option value="1" >One</option>
            <option value="2" >Two</option>
            <option value="3" >Three</option>
            <option value="4" >Four</option>
            <option value="5" >Five</option>

        </select>
        </div>
        <div class="field-wrap">
        <div class="row">
            <input type="text" name="firstname[]" placeholder="First Name">
            <input type="text" name="lastname[]" placeholder="Last Name">
        </div>
        </div>
    </form>
    <script type="text/javascript">
        $(function(){
            $('.dropdown').change(function(){
                let dval = $(this).val();
                let fHTML = "";
                for (let i = 0; i < dval; i++) 
                    fHTML += '<div class="row"><input type="text" name="firstname[]" placeholder="First Name"><input type="text" name="lastname[]" placeholder="Last Name"></div>'
                $('.field-wrap').html(fHTML);
            });
        })
    </script>
</body>
</html>
...