AddEventListener не работает с недавно добавленным innerHtml?

Вопросов по этой проблеме очень много, все они охватывают разные ситуации. В этой ситуации мне никто не поможет.

1. Я не добавляю прослушиватель кликов до того, как элемент будет «создан»,

2. Я не вызываю обратный вызов в методе события (вместо этого я передаю его в более высоком порядке)

3. Цифра всегда правильная

 this.update = function(data,status,num){
        var raceview = document.getElementById("raceview")
    if (status == "domestic"){
        raceview.innerHTML += `<div class = "race">
                                <img id = "raceprofileimg" src = "${data.image}" alt = "">
                                <h3 id  = "pendingmessage">Race is Pending</h3>
                                <h3 id = "username" class = "racenames">${data.name}</h3>
                              </div>`

        
    }
    else if (status == "pending"){ //both parties accepted the race
        raceview.innerHTML += `<div class = "race">
            <img id = "raceprofileimg" src = "${data.image}" alt = "">
            <h3 id = "name${num}" class = "racenames">${data.name}</h3>
            <button id = "${num}" class = "racebuttons" type = "button">Won</button>
            <button  id = "${num}"class = "rejectbuttons" type = "button">Loss</button>   
        </div>`


    }
    else{
    
            raceview.innerHTML += `<div class = "race">
                    <img id = "raceprofileimg" src = "${data.image}" alt = "">
                    <h3 id = "name${num}" class = "racenames">${data.name}</h3>
                    <button id = "race${num}"  class = "racebuttons" type = "button">Race</button>
                    <button id = "reject${num}"  class = "rejectbuttons" type = "button">Reject</button>  
                              </div>`
        

            document.getElementById("race"+num).addEventListener("click",function(){self.accept_race(num,data.name)})               
    }


    
    
        

}

Сгенерированный HTML-код:

Я так понимаю кнопки появляются? Я пытался воспроизвести это в своей консоли, но там срабатывает. Вы объявляли self раньше? Или должно быть this?

Josef Wittmann 12.12.2020 08:47

Эта функция глубоко вложена в кучу обратных вызовов и лямбда-выражений (вот причина использования ссылки на себя). переменная самость = это; вызов функции сам по себе работает в 100% случаев. Так что я не верю, что есть проблема с собственной функциональностью. так как self.accept_race() работает нормально. @ЙозефВиттманн

RonRon Scores 12.12.2020 08:52

Тогда мне нужно больше контекста... Можете ли вы предоставить ссылку на код?

Josef Wittmann 12.12.2020 09:01

@JosefWittmann Я добавил больше информации для понимания

RonRon Scores 12.12.2020 09:06
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
150
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя raceview.innerHTML +=, вы перезаписываете все элементы DOM в raceview. Они теряют все привязки событий, потому что весь элемент raceview перестраивается.

Последняя кнопка должна работать, я думаю.

Вы можете решить это так:

const race = document.createElement("div");
race.classList.add("race");
raceview.appendChild(race);

race.innerHTML = `...`;

document
  .getElementById("race" + num)
  .addEventListener("click", /* your handler */);

Легко понять, спасибо за понимание. Это ответило на мой вопрос.

RonRon Scores 12.12.2020 10:09

Пожалуйста. Для вашего следующего проекта вы можете рассмотреть библиотеки представлений, такие как React или Vue, поскольку они значительно упрощают процесс создания элементов в JS.

Josef Wittmann 12.12.2020 10:41

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