Я сыграл немного с вашим кодом, пытаясь оптимизировать весь код и избежать дублирования ...
Чтобы добиться этого, я сделал следующие модификации:
- ПеремещеноHTML-код из JS в HTML, так что HTML остается в HTML.
- То же самое для CSS, лучше не использовать встроенный CSS в HTML, поэтому добавлен класс «скрытый», чтобы использовать его для элементов с
style="display: none;"
. - Нет дубликата HTML, короче JS… Форма начинается пусто, JS добавляет один «блок» при загрузке, используя шаблон в HTML.Таким образом, мы гарантируем, что вся форма всегда будет одинаковой.
… в итоге получим этот рабочий фрагмент:
(подробности см. В комментариях к коду)
var maxGroup = 50;
// TAKIT: Added these variables to use the "templates" I added in HTML
var blockTemplate = $('#Templates > .block')[0].outerHTML;
var fieldTemplate = $('#Templates .fieldGroup:last')[0].outerHTML;
// Add another block
$('.add').click(function() {
$('form .add').before(blockTemplate); // TAKIT: Modified
// TAKIT: Removed the $(document).ready that was here ! What was that?
});
// TAKIT: Modified this function, too
// Add field
$('.cardBox').on('click', '.addMore', function() {
if ($('form .fieldGroup').length > maxGroup) {
alert('Maximum ' + maxGroup + ' groups are allowed.');
return; // Exit
}
$(this).closest(".card").find('.fieldGroup:last').after(fieldTemplate); // TAKIT: Modified here
});
// Remove field
$('.cardBox').on('click', '.removeField', function() {
$(this).parent().remove();
});
// TAKIT: Add a block on load
$('.add').trigger('click');
/* TAKIT: Added some CSS */
.hidden {
display: none;
}
.fieldGroup {
display: flex;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
<body>
<form method="post" action="">
<div class="cardBox">
<a class="add">[ADD block]</a>
</div>
</form>
<!-- TAKIT: Created templates here, so that HTML stays in HTML -->
<div class="hidden" id="Templates">
<!-- TAKIT: block template -->
<div class="block">
<div class="card">
<!-- TAKIT: field template -->
<div class="fieldGroup">
<input type="text" name="name[]" class="form-control" placeholder="Enter name" />
<a href="javascript:void(0)" class="btn btn-success addMore"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span>Add</a>
</div>
<div class="fieldGroup">
<input type="text" name="" class="form-control" placeholder="Enter Your Question" />
<a href="javascript:void(0)" class="btn btn-danger removeField"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span>Remove</a>
</div>
</div>
<br><!-- TAKIT: Added, just because -->
</div>
</div>
</body>
Обратите внимание, что я удалил некоторые элементы, такие как input-group
и input-group-addon
, потому что они мне не нужны во фрагменте, но это может бытьлегко добавляется обратно в HTML «шаблоны».
Не стесняйтесь комментировать, если что-нибудь.
Надеюсь, это поможет.