Вам не нужен идентификатор, если вы используете класс, такой как .product
, для определения продукта .
, чем использование jQuery '.on()
метода с динамическим событием c Делегирование для удаления элемента путем перехода от Event.target
к .product
с помощью .closest()
:
jQuery($ => { // DOM ready and $ alias in scope
let i = 0;
const template_product = (html="") => `<div class="product col-md-3 col-sm-6 col-xs-12">
<div>${html}</div>
<button type="button" class="delete-product">Delete</button>
</div>`;
const addProduct = () => $('#products').append(template_product(`Product: ${++i}`));
const deleteProduct = (ev) => $(ev.target).closest('.product').remove();
$('.add-product').on('click', addProduct);
$('#products').on('click', '.delete-product', deleteProduct);
});
<button type="button" class="add-product">ADD PRODUCT</button>
<div id="products"></div>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
Без делегирования события:
Другой часто используемый способ - объявить действие кнопки «Удалить» заранее:
jQuery($ => { // DOM ready and $ alias in scope
const newProduct = (html='') => $('<div/>', {
class: 'product col-md-3 col-sm-6 col-xs-12',
html: `<div>${html}</div>`,
appendTo: '#products',
append: $('<button/>', {
class: 'delete-product',
type: 'button',
text: 'Delete',
click() {
$(this).closest('.product').remove();
}
})
});
let i = 0;
$('.add-product').on('click', () => newProduct(`Product: ${++i}`));
});
<button type="button" class="add-product">ADD PRODUCT</button>
<div id="products"></div>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
, даже если он соблюдает принципы шаблонного и инкапсулированного компонента - приведенное выше может показаться немного сложным для разработчика fre sh.