Нет, проблема не в том, что элементы связаны или не связаны со слушателями.Проблема в этой строке
cloneAndAppendCounter++;
или, точнее, в том месте, куда вы его положили, потому что, как оказалось, это играет драматическую роль.
Итак, дело в том, что вы добавляете элемент с определенным идентификатором к цели, а затем увеличиваете счетчик.Таким образом, к тому времени, когда вы нажимаете кнопку remove
, счетчик больше, чем число добавленных дочерних элементов на одного, и поэтому первый щелчок не действует - потому что он идет напрасно.
Вот рабочий скрипт (я переставил проблемную строку в место, куда она лучше всего подходит и, кроме того, изменил начальные счетчики):
var cloneAndAppendCounter = -1;
function cloneAndAppend (what, target, maxClones) {
var id = what.attr('id');
var clone = what.clone(true);
var target = target;
if ( cloneAndAppendCounter < maxClones ) {
cloneAndAppendCounter++;
clone.attr('id', id + cloneAndAppendCounter);
clone.appendTo(target);
// console.log('counter: ', cloneAndAppendCounter);
}
};
function destroyClonedElement (originalElement, when) {
var originalElementId = originalElement.attr('id');
var clonedElementId = originalElementId + cloneAndAppendCounter;
var cloned = $('#' + clonedElementId);
// console.log('clonedElementId:', clonedElementId);
// console.log(cloned);
if ( cloned && cloneAndAppendCounter > -1 ) {
cloned.remove();
cloneAndAppendCounter--;
// console.log('counter: ', cloneAndAppendCounter);
};
};
$('.clone-button').click(function () {
cloneAndAppend($('#app'), $('.container'), 4);
});
$(document).on('click','.destroy-button', function (e) {
e.preventDefault();
destroyClonedElement($('#app'))
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class="clone-button">clone button</button>
<button class="destroy-button">destroy button</button>
<div class="container">
<div id="app">test</div>
</div>