Я пишу веб-приложение как домашнее задание, которое использует websocket для получения сообщений от сервера и отображения их на html с помощью руля. js.
Я пытаюсь реализовать Функция удаления сообщения с использованием следующего кода:
document.addEventListener('DOMContentLoaded', () => {
...
let message_container = document.querySelector("#message_container");
const message_template = Handlebars.compile(document.querySelector("#message_template").innerHTML);
const delete_button_template = Handlebars.compile(document.querySelector("#delete_button_template").innerHTML);
function addDeleteButton(id) {
let con = delete_button_template({"message_id": id}); //line #1
document.querySelector("#content_" + id).innerHTML += con;
document.querySelector("#delete_button_" + id).onclick = function () {
const msg_id = event.target.dataset.message_id;
const msg = document.querySelector("#message_" + msg_id);
const blank = document.querySelector("#message_" + msg_id + "_newline");
msg.parentElement.removeChild(msg);
blank.parentElement.removeChild(blank);
}
}
Функция добавления сообщения в DOM проста:
function newMessage(i) {
let msg = message_template({
"message_id": i.message_id,
"username": ...,
"timestamp": ...,
"content": ...
});
message_container.innerHTML += msg;
addDeleteButton(i.message_id);
}
Рули. js Шаблон для удаления кнопка подключена к HTML следующим образом:
<button id="delete_button_{{ message_id }}" data-message_id="{{ message_id }}" class="btn btn-primary">
Delete
</button>
Однако каждый раз, когда я добавляю новое сообщение (включая кнопку удаления) в DOM, все предыдущие кнопки теряют свои прослушиватели событий onclick (). Инспектор chrome ясно показывает это, и это происходит в строке № 1:
Для 4-й кнопки зарегистрирован прослушиватель событий.
Добавление 5-й кнопки
Событие onclick 4-й кнопки исчезло.
Обходное решение - встроить вызов onclick в атрибут html. Но почему я не могу зарегистрировать слушателей событий, как в указанном коде?