Проблема с перебором списка узлов

Я создаю простое приложение 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)    
});
}

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

T.J. Crowder 23.02.2019 16:40

Прекрасный пример, чувак. Разобрался легко. Я отредактирую свой ответ с исправлением. Я просто создал отдельную функцию и добавил туда событие.

noobcoderiam 23.02.2019 19:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
26
0

Другие вопросы по теме