我正在编写一个 Web 应用程序作为家庭作业项目,它使用 websocket 从服务器接收消息并使用handlebars.js 将它们显示在 html 上。
我正在尝试使用以下代码实现删除消息的功能:
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);
}
删除按钮的handlebars.js 模板插入到 HTML 中,如下所示:
<button id="delete_button_{{ message_id }}" data-message_id="{{ message_id }}" class="btn btn-primary">
Delete
</button>
但是,每次我向 DOM 添加新消息(包括删除按钮)时,所有先前的按钮都会丢失其 onclick() 事件侦听器。chrome 检查器清楚地显示了这一点,它发生在第 1 行:
第四个按钮注册了一个事件侦听器。
一个明确的解决方法是将 onclick 调用嵌入到 html 属性中。但为什么我不能像给定的代码那样注册事件侦听器?
富国沪深
相关分类