第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用Handlebar.js模板為多個(gè)按鈕添加onclick事件監(jiān)聽(tīng),只有最后一個(gè)有效

使用Handlebar.js模板為多個(gè)按鈕添加onclick事件監(jiān)聽(tīng),只有最后一個(gè)有效

千萬(wàn)里不及你 2024-01-03 15:22:32
我正在編寫(xiě)一個(gè) Web 應(yīng)用程序作為家庭作業(yè)項(xiàng)目,它使用 websocket 從服務(wù)器接收消息并使用handlebars.js 將它們顯示在 html 上。我正在嘗試使用以下代碼實(shí)現(xiàn)刪除消息的功能: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 的函數(shù)很簡(jiǎn)單: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 添加新消息(包括刪除按鈕)時(shí),所有先前的按鈕都會(huì)丟失其 onclick() 事件偵聽(tīng)器。chrome 檢查器清楚地顯示了這一點(diǎn),它發(fā)生在第 1 行:第四個(gè)按鈕注冊(cè)了一個(gè)事件偵聽(tīng)器。添加第五個(gè)按鈕第四個(gè)按鈕的onclick事件消失了。一個(gè)明確的解決方法是將 onclick 調(diào)用嵌入到 html 屬性中。但為什么我不能像給定的代碼那樣注冊(cè)事件偵聽(tīng)器?
查看完整描述

1 回答

?
富國(guó)滬深

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊

問(wèn)題在于以下行:

message_container.innerHTML += msg;

我們使用 Handlebars 生成一個(gè)新的 HTML 字符串,并將其存儲(chǔ)到msg變量中。然后我們想要將新的 HTML附加#message_container到DOM 元素。

然而,它并不是message_container.innerHTML += msg簡(jiǎn)單地將我們的新 HTML 附加到,而是替換!的所有后代 DOM 節(jié)點(diǎn)。#message_container #message_container

發(fā)生的情況的細(xì)分是:

  • 我們獲取 DOM 中的后代節(jié)點(diǎn)#message_container,并將其字符串化為 HTML 字符串。

  • msg連接到這個(gè)新 HTML 字符串的末尾。

  • 新的 HTML字符串取代innerHTML#message_container.

這里重要的部分是替換。當(dāng)innerHTMLof#message_container被替換時(shí),它的所有后代節(jié)點(diǎn)都被替換。<button>因此,您之前附加偵聽(tīng)器的所有sonclick都已從 DOM 中刪除。

防止#message_container每次添加 a 時(shí)替換所有子級(jí)的一種方法<button>是使用Node.appendChild()API。結(jié)果代碼如下所示:

// message_container.innerHTML += msg; // TODO: Replace this line with the below.


const node = document.createElement('div');

node.innerHTML = msg;

message_container.appendChild(node);

我創(chuàng)建了一個(gè)小提琴供參考。



查看完整回答
反對(duì) 回復(fù) 2024-01-03
  • 1 回答
  • 0 關(guān)注
  • 203 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)