JQuery clone div при каждом нажатии

У меня простая форма и кнопка для клонирования моей формы при нажатии. Проблема в том, что когда я нажимаю кнопку в первый раз, она работает правильно, но в течение последующих раз она добавляет много divs при нажатии. Есть ли способ копировать один за другим каждый раз при нажатии? вот мой фрагмент:

$(document).ready(function() {
    $(".Add").click(function() {
        $(".formi").clone().insertAfter(".formi:last");
    });
});
.formi {
    border: 1px solid #000;
    width: 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
    <form class="formi">
        <input type="text" placeholder="name" />
        <select name="cars">
            <option value="">one</option>
            <option value="">two</option>
        </select>
        <button type="submit">ok</button>
    </form>
</div>

Ответы

Ответ 1

Вы можете найти первую форму вместо поиска всего в DOM с помощью eq(0) или найти последнюю,

$(document).ready(function(){
    $(".Add").click(function(){
		  $(".formi").eq(0).clone().insertAfter(".formi:last");
//$(".formi:last").clone().insertAfter(".formi:last");
    });
});
.formi{border:1px solid #000;width:50%;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
<form class="formi">
<input type="text" placeholder="name"/>
<select name="cars">
<option value="">one</option>
<option value="">two</option>
</select>
<button type="submit">ok</button>
</form>
</div>

Ответ 2

$(".formi").clone(). клонирует все элементы .formi, доступные на странице. Вам нужно только клонировать первый элемент .formi, а не .formi, который был добавлен с помощью шаблона.

$(".Add").click(function(){
    var $formTemplate = $(".formi:first");
    $formTemplate.clone().insertAfter(".formi:last");
});

Ответ 3

Вам нужно клонировать только первое, используя метод .eq(), который уменьшает набор согласованных элементов до тех, которые указаны в указанном индексе.

Пожалуйста, попробуйте следующее:

$(".formi").eq(0).clone().insertAfter(".formi:last");

Литература:

$(document).ready(function() {
  $(".Add").click(function() {
    $(".formi").eq(0).clone().insertAfter(".formi:last");

  });
});
.formi {
  border: 1px solid #000;
  width: 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
  <form class="formi">
    <input type="text" placeholder="name" />
    <select name="cars">
      <option value="">one</option>
      <option value="">two</option>
    </select>
    <button type="submit">ok</button>
  </form>
</div>

Ответ 4

$(document).ready(function(){
    $(".Add").click(function(){
		$(".formi").eq(0).clone().insertAfter(".formi:last");
    });
});
.formi{border:1px solid #000;width:50%;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
<form class="formi">
<input type="text" placeholder="name"/>
<select name="cars">
<option value="">one</option>
<option value="">two</option>
</select>
<button type="submit">ok</button>
</form>
</div>

Ответ 5

$(document).ready(function() {
  $(".Add").click(function() {
    $(".formi:nth-child(1)").clone().insertAfter(".formi:last");

  });
});
.formi {
  border: 1px solid #000;
  width: 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
  <form class="formi">
    <input type="text" placeholder="name" />
    <select name="cars">
      <option value="">one</option>
      <option value="">two</option>
    </select>
    <button type="submit">ok</button>
  </form>
</div>

Ответ 6

$(document).ready(function(){
    $(".Add").click(function(){
		$(".formi:last").clone().insertAfter(".formi:last");

    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
<form class="formi">
<input type="text" placeholder="name"/>
<select name="cars">
<option value="">one</option>
<option value="">two</option>
</select>
<button type="submit">ok</button>
</form>
</div>

Ответ 7

Используйте :nth-child(1)

$(document).ready(function(){
    $(".Add").click(function(){
		$(".formi:nth-child(1)").clone().insertAfter(".formi:last");

    });
});
.formi{border:1px solid #000;width:50%;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<span class="Add">Add+</span>
<div class="all">
<form class="formi">
<input type="text" placeholder="name"/>
<select name="cars">
<option value="">one</option>
<option value="">two</option>
</select>
<button type="submit">ok</button>
</form>
</div>

Ответ 8

Используйте first(), метод first() возвращает первый элемент выбранных элементов.

$(document).ready(function() {
  $(".Add").click(function() {
    $(".formi").first().clone().insertAfter(".formi:last");

  });
});
.formi {
	border: 1px solid #000;
	width: 50%;
}
<span class="Add">Add+</span>
<div class="all">
  <form class="formi">
    <input type="text" placeholder="name" />
    <select name="cars">
      <option value="">one</option>
      <option value="">two</option>
    </select>
    <button type="submit">ok</button>
  </form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 

Ответ 9

Я прокомментировал, где вы делаете ошибку и что будет возможным решением для этого

$(document).ready(function() {
$(".Add").click(function() {
//Mistake : when you are clicking second time, you clone both the forms having class '.formi'
$(".formi").clone().insertAfter(".formi:last");

// $(".formi:nth-child(1)").clone().insertAfter(".formi:last"); : This one will work

  });
});