В своем комментарии я предложил вам прослушать всплывающее событие клика из removeBtn
.В этом случае все, что вам нужно, это удалить логику присвоения атрибута onclick
из вашего кода и вместо этого дать вашему removeButton
идентифицируемое свойство, такое как класс.Давайте присвоим ему класс delete-button
:
var removeBtn = document.createElement("button");
removeBtn.classList.add('delete-button');
removeBtn.type = 'button';
removeBtn.innerHTML = 'X';
Затем вы можете прослушать событие щелчка на уровне #output
, которое гарантированно будет присутствовать во время выполнения.Когда событие вызывается, вы просто проверяете, имеет ли цель события идентифицируемое свойство, например, класс remove-button
в нашем случае:
output.addEventListener('click', function(e) {
// GUARD: Do nothing if click event does not originate from delete button
if (!e.target.matches('.remove-button')) {
return;
}
// Delete parent node
e.target.closest('li').remove();
});
Если событие click не возникло из кнопки удаления, мыпросто return
и больше ничего не делай.В противном случае мы знаем, что кнопка была нажата, и мы можем затем использовать Element.closest()
, то есть .closest('li')
, чтобы извлечь ближайший <li>
родительский узел и удалить его.
Есливам абсолютно необходимо поддерживать IE11 (который, в свою очередь, не поддерживает Element.closest()
), вы также можете использовать Node.parentNode
для доступа и удаления элемента <li>
, предполагая, что ваша кнопка удаления является прямойпотомок элемента <li>
:
// Delete parent node
e.target.parentNode.remove();
См. подтверждение концепции ниже:
var rows = 10;
var output = document.getElementById('output');
for (var i = 0; i < rows; i++) {
var list = document.createElement('li');
var node = document.createTextNode('Testing. Row #' + i);
var removeBtn = document.createElement("button");
removeBtn.classList.add('remove-button');
removeBtn.type = 'button';
removeBtn.innerHTML = 'X';
list.appendChild(node);
list.appendChild(removeBtn);
output.appendChild(list);
}
output.addEventListener('click', function(e) {
// GUARD: Do nothing if click event does not originate from delete button
if (!e.target.matches('.remove-button')) {
return;
}
e.target.closest('li').remove();
});
<ul id="output"></ul>