Задать вопрос
NikFaraday
@NikFaraday
Student full-stack Developer

Почему после добавления нового блока слетают события со всех остальных?

Есть у меня блок с блоками, выглядит примерно вот так:
<div id="client-personal-note-container">
<div id="client-personal-note-@item.Id" class="card card-body">
                <i class="text-break" id="note-@item.Id">@item.Note</i>
                <b>@item.CreatedOn.ToString("dd.MM.yyyy HH:mm")</b>
                <br />
                <a id="btn-@item.Id" data-target="#delete-note-modal" data-toggle="modal" href="#"><b>@localizator["Delete"]</b></a>
            </div>
</div>


При загрузке страницы я делаю бинд клика (Код немного старый и кривой, переписывать не времени, не ругайте):
let buttons = $("[id|=btn]");
let noteModal = document.getElementById('note-modal');

for (let i = 0; i < buttons.length; i++) {
    buttons[i].onclick = () => {
        let buttonId = buttons[i].id.split('-')[1]; // Ставил тут брейк поинт. Читайте дальше, там написано
        let note = document.getElementById('note-' + buttonId).innerHTML;
        noteModal.innerHTML = note;

       // Server request

 });
    }


И всё работает отлично, как положено (При клике открывается модалка, куда переносится инфа, мол, подтвердите удаление). Вот только проблема в том, что когда я добавляю новый блок вот таким кодом:
success: (response) => {
            let clientNote = response.note;
            let appendNotemakrup = '<div id="client-personal-note-' + clientNote.id + '" class="card card-body alert-success">' +
                '<i class="text-break" id="note-' + clientNote.id + '">' + clientNote.note + '</i>' +
                '<b>@localizator["JustCreated"]</b>' +
                '<br />';
            document.getElementById('client-personal-note-container').innerHTML += appendNotemakrup;
            $('#note').val('');

            location.href = '#client-personal-note-' + clientNote.id;
            setTimeout(() => {
                $('#client-personal-note-' + clientNote.id).removeClass('alert-success');
            }, 3000);
        },

То слетают все события и модалка уже открывается, но ничего не меняется там. Дебагал код, до добавления ставил брейкпоинты (выше в коде есть комментарий где) и они срабатывают. После добавления уже не работают.

Тут появляется вопрос, клик события реально слетают? Ну, тогда мне будет смысл опять их переназначать, ещё и добавлять туда новый блок сразу же (точнее, он сам добавится). Или же я просто где-то словил багу и не могу понять где.
  • Вопрос задан
  • 213 просмотров
Подписаться 1 Средний 17 комментариев
Решения вопроса 1
MrDecoy
@MrDecoy Куратор тега JavaScript
Верставший фронтендер
После этого и срабатывает этот блок success. где отрисовывается новый блок.

document.getElementById('client-personal-note-container').innerHTML += appendNotemakrup;

Нет, это НЕ добавление нового элемента.
Это чтение разметки КАК СТРОКИ, добавление к этой СТРОКЕ новой СТРОКИ и потом преобразование под капотом в DOM элементы. Понимаете?

То есть все элементы что у Вас были - умирают и заменяются НОВЫМИ. Без добавленных на них ранее обработчиков.

Как исправить?
Основных пути 2:
1) Научиться именно добавлять элементы https://learn.javascript.ru/modifying-document
2) Освоить делигирование событий https://learn.javascript.ru/event-delegation
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sslion
@sslion
а ни чо что ID может быть только один? ты на новый ID вешаешь слушатель, значит со старого слушатель слетит.... это же очевидно...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 10:12
10000 руб./за проект
22 дек. 2024, в 09:51
3000 руб./за проект
22 дек. 2024, в 09:34
500 руб./за проект