Проблема в том, что, хотя вы используете делегированные обработчики событий, вы выбираете только элементы при загрузке DOM.Чтобы исправить это, передайте аргумент селектора в on()
в виде строки.Таким образом, селектор будет сопоставляться с пузырем событий click
через #container
, а не только для конкретных экземпляров элемента.
Также обратите внимание, что вам нужно сделать вызов append()
only на ol
, что соответствует кнопке .btnAddListElement
, по которой вы щелкнули, в противном случае вы добавите новый li
в каждый список.Для этого измените $('ol')
на $(this).prev('ol')
.
var $container = $("#container");
$container.on("click", ".btnDeleteListItem", function(e) {
$(this).parent().remove();
console.log("list item deleted");
});
$container.on("click", '.btnAddListElement', function(e) {
var html = '<li> Just added <button class="btnDeleteListItem">Delete</button></li>';
$(this).prev("ol").append(html);
console.log("list item added");
});
$container.on("click", '.btnDeleteList', function(e) {
$(this).parent().remove();
console.log("list deleted");
});
$container.on('click', '.btnAddList', function(e) {
var html = '<div class="listContainer"><ol><li>Other list <button class="btnDeleteListItem">Delete</button></li><li>Other list <button class="btnDeleteListItem">Delete</button></li><li>Other list <button class="btnDeleteListItem">Delete</button></li></ol><button class="btnAddListElement">+Add List Item</button><button class="btnDeleteList">Delete List</button></div>';
$(html).insertBefore($(this));
console.log("list added");
});
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<div id="container">
<div class="listContainer">
<ol>
<li>First list <button class="btnDeleteListItem">Delete</button></li>
<li>First list <button class="btnDeleteListItem">Delete</button></li>
<li>First list <button class="btnDeleteListItem">Delete</button></li>
</ol>
<button class="btnAddListElement">+Add List Item</button>
<button class="btnDeleteList">Delete List</button>
</div>
<button class="btnAddList">+Add List</button>
</div>