Форма клона, добавьте новый каждый - PullRequest
2 голосов
/ 20 марта 2019

Мне нужно добавить одну за другой форму, когда я нажимаю кнопку, но при втором щелчке функция добавляет несколько форм.

Что я делаю не так в моем сценарии?

Спасибо

$('.add-more-btn').click(function() {
  var clone = $('.form-main').clone('.form-block');
   var   block = $('.form-block')
  $(block).append(clone);
});
<link href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <title>Clone forms</title>
</head>
<body>
<div class="container">
  <div class="row">
  <div class="col-xs-12">
    <form class="form-main">
      <div class="form-block">
        <div class="form-group">
          Name
        <input type="text" name="name[]" class="form-control">
        </div>
        <div class="form-group">
          Email
        <input type="text" name="email[]" class="form-control">
        </div>
        <hr>
      </div>
    </form>
    <a class="btn btn-primary add-more-btn">Add one</a>
  </div>
</div>
</div>

Ответы [ 4 ]

1 голос
/ 20 марта 2019

Вы хотите продублировать .form-block и добавить его к <form> ...
Итак, сначала правильно определите элементы ... Форма и элемент, который нужно клонировать.

Затем, .clone() из сохраненного "шаблона" при нажатии.

Обратите внимание, что вам нужно клонировать для "шаблона" ... И снова при нажатии!

var template = $(".form-block").clone();
var form = $(".form-main");

$('.add-more-btn').on('click',function() {
   var newFormBlock = template.clone(); // Clone again here, to be able to append more than once.
   form.append(newFormBlock);
});
<link href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <title>Clone forms</title>
</head>
<body>
<div class="container">
  <div class="row">
  <div class="col-xs-12">
    <form class="form-main">
      <div class="form-block">
        <div class="form-group">
          Name
        <input type="text" name="name[]" class="form-control">
        </div>
        <div class="form-group">
          Email
        <input type="text" name="email[]" class="form-control">
        </div>
        <hr>
      </div>
    </form>
    <a class="btn btn-primary add-more-btn">Add one</a>
  </div>
</div>
</div>
1 голос
/ 20 марта 2019

Другое решение с html, которое копирует первый набор элементов.

var clone = $('.form-main').html();
$('.add-more-btn').click(function() {
  $('.form-main').append(clone);
});
<link href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <title>Clone forms</title>
</head>
<body>
<div class="container">
  <div class="row">
  <div class="col-xs-12">
    <form class="form-main">
      <div class="form-block">
        <div class="form-group">
          Name
        <input type="text" name="name[]" class="form-control">
        </div>
        <div class="form-group">
          Email
        <input type="text" name="email[]" class="form-control">
        </div>
        <hr>
      </div>
    </form>
    <a class="btn btn-primary add-more-btn">Add one</a>
  </div>
</div>
</div>
1 голос
/ 20 марта 2019

Поскольку при использовании метода clone в классе css каждый контейнер div с классом css .form-block клонируется.Когда вы добавляете еще один блок с классом css .form-block, у вас есть два блока с одинаковым именем класса.При следующем нажатии вы клонируете два элемента и так далее.

Почему бы не использовать тег шаблона HTML5.Используя этот собственный тип шаблонов, вы можете заархивировать несколько преимуществ.Ваша форма будет быстрее, потому что вам не нужно загружать библиотеку jQuery.С помощью нескольких строк нативного JavaScript вы можете архивировать, что хотите.Посмотрите на следующий пример.

<form id="my-form" action="" method="post">

</form>
<button id="add-button">Add</button>
<template id="my-template">
    <div>
        <label>
            <span>Name</span>
            <input type="text" name="name[]" placeholder="your name">
        </label>
    </div>
</template>

Пока это HTML-пример.Вы можете добавить свои собственные элементы ввода и стили здесь.Этот фрагмент кода предназначен только для примера.

Теперь пришло время для некоторого собственного JavaScript.

<script>
    document.getElementById('add-button').addEventListener('click', function(event) {
        var form = document.getElementById('my-form'),
            template = document.getElementById('my-template'),
            clone = document.importNode(template.content, true);

        form.appendChild(clone);
    }, false);

    // to add the first input element automatically
    var event = new Event('click');
    document.getElementById('add-button').dispatchEvent(event);
</script>

Это работает в любом современном браузере.Дополнительные сведения о теге шаблона html5 и его функциях см. В MDN Web Docs .Также посмотрите на caniuse.com , чтобы увидеть поддержку браузера.Как видите, Microsoft Internet Explorer 11 не поддерживает тег шаблона и его функциональность.Для этого есть несколько поразительных полизаполнений, таких как небольшой шаблонный полифилл *1018*, который можно использовать, когда требуется поддержка IE11.

1 голос
/ 20 марта 2019

Не клонировать при нажатии кнопки. Клонирование того, что находится в форме во время клика, увеличивается с каждым кликом. Вместо этого клонируйте форму при загрузке и сохраните ее в переменной. Затем используйте его столько раз.

var clone = $('.form-block').clone();
$('.add-more-btn').click(function() {
  $('.form-main').append(clone);
});

И обратите внимание, что .clone () не принимает передаваемый вами параметр.

...