Я создаю простое приложение todo на простом ванильном jS, но у меня возникла проблема с назначением прослушивателя событий для предварительно заполненных данных. Это странно, потому что я могу назначить им кнопку, но прослушиватель событий не будет работать.
Когда я создаю новые элементы списка и назначаю прослушиватель событий кнопке, при нажатии элемент списка удаляется без проблем.
Потратил полтора часа на это и не могу понять. Ниже блока кода находится функция, которая загружается на мою html-страницу. У меня есть 4 предварительно заполненных элемента списка, и эта функция успешно добавляет кнопку к каждому элементу списка, но не может добавить прослушиватель событий.
function applyButton(){
var getListObjects = document.querySelectorAll("li")
for(var i = 0; i< getListObjects.length; i++){
var node2 = document.createElement('BUTTON')
var textnode2 = document.createTextNode('Delete')
node2.appendChild(textnode2)
getListObjects[i].appendChild(node2)
var x = getListObjects[i]
x.querySelector('button').addEventListener('click', function(){
x.querySelector('button').parentNode.parentNode.removeChild(x)
})
}
}
Код ниже принимает входное значение и создает новый элемент списка с кнопкой удаления, который успешно имеет прослушиватель событий для удаления элемента списка. Я пытался скопировать это слово в слово с помощью другой функции, но безрезультатно. Этот приведенный ниже код работает отлично, как и предполагалось.
var newNoteValue = document.getElementById('newNote').value
var addItemButton = document.getElementById('addItem')
var onEnter = document.getElementById('newNote')
addItemButton.addEventListener('click', function(){
var item = document.getElementById('newNote').value
var node = document.createElement("LI")
var textnode = document.createTextNode(item)
node.appendChild(textnode)
document.getElementById('list-body').appendChild(node)
var node2 = document.createElement('BUTTON')
var textnode2 = document.createTextNode('Delete')
node2.appendChild(textnode2)
node.appendChild(node2)
node2.addEventListener('click', function(){
node2.parentNode.parentNode.removeChild(node)
});
document.getElementById('newNote').value = ''
});
РЕДАКТИРОВАТЬ - Решение, основанное на рекомендуемом ответе
function applyButton(){
var getListObjects = document.querySelectorAll("li")
for(var i = 0; i< getListObjects.length; i++){
var node2 = document.createElement('BUTTON')
var textnode2 = document.createTextNode('Delete')
node2.appendChild(textnode2)
getListObjects[i].appendChild(node2)
addEventToButton2(getListObjects[i])
}
}
function addEventToButton2(currentListItem){
let y = currentListItem.querySelector('button')
y.addEventListener('click', function(){
y.parentNode.parentNode.removeChild(currentListItem)
});
}
Прекрасный пример, чувак. Разобрался легко. Я отредактирую свой ответ с исправлением. Я просто создал отдельную функцию и добавил туда событие.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


См. ответы на связанный вопрос. Причина, по которой он работает как одноразовый, заключается в том, что
node2никогда не меняется. Причина, по которой это не работает в цикле, заключается в том, чтоxделает изменяется (хотя оно объявлено в теле цикла, на самом деле оно имеет область действия). Таким образом, все эти прослушиватели событий используют значение последний, присвоенноеx. Связанные ответы говорят, как это исправить. Удачного кодирования! :-)