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

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

將事件偵聽器添加到動(dòng)態(tài)創(chuàng)建的元素中

將事件偵聽器添加到動(dòng)態(tài)創(chuàng)建的元素中

有只小跳蛙 2021-11-18 16:06:45
我目前在嘗試為foreignObject使用 vanilla JS 呈現(xiàn)的某些s添加單擊事件偵聽器時(shí)遇到一些問題。當(dāng)我在點(diǎn)擊功能上使用內(nèi)置的 d3 時(shí),它可以工作,但我更愿意使用 javascript 代碼完成它。但是,該函數(shù)永遠(yuǎn)不會(huì)為這些元素觸發(fā),我不明白為什么。代碼示例不完整,但應(yīng)該突出顯示我正在嘗試做的事情。var nodes = g.selectAll("foreignObject")    .data(response.nodes)    .enter()    .append("foreignObject")    .attr("x", function(d) {        return d.x - nodeWidth / 2;    })    .attr("y", function(d) {        return d.y - nodeHeight / 2;    })    .attr("width", nodeWidth)    .attr("height", nodeHeight)    .append("xhtml:div")    .attr("class", "outer")    .html(function(d) {         var nodeHtml = createNodeElement(d);        return nodeHtml.outerHTML;    })   // If I append the img like this, it works, but ends up in the wrong "element scope"   .append("img")        .attr("class", "optionsImg")        .attr("src","/images/options-squares.svg")        .on("click", function(d) {            currentTooltipObject = d;            renderTooltipDiv();        });function createNodeElement(d) {    let nodeElement = document.createElement("div");    nodeElement.className = "nodeElement";    let nodeOptionsImg = document.createElement("img");    nodeOptionsImg.className = "nodeOptionsImg";    nodeOptionsImg.src = "/images/options-squares.svg";    nodeOptionsImg.addEventListener("click", function() {        console.log("Clicked on optionsImg for this object: "+d);    });    nodeElement.appendChild(nodeOptionsImg);    return nodeElement;}
查看完整描述

2 回答

?
慕仙森

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

您的方法的主要問題是使用outerHTML和innerHTML(由 內(nèi)部使用.html())來創(chuàng)建/移動(dòng)/復(fù)制元素有點(diǎn)像序列化和反序列化您的 HTML DOM 樹。這適用于 HTML 元素本身,但是,它不保留事件偵聽器。因此,createNodeElement在此過程中,您附加到函數(shù)中元素的偵聽器將丟失。這是其他問題的變體,例如“是否可以在不破壞后代事件偵聽器的情況下附加到innerHTML?” .


如果您退后一步并重新閱讀 D3 API文檔,您會(huì)發(fā)現(xiàn)您實(shí)際上已經(jīng)差不多了:D3 提供了將本機(jī) DOM 節(jié)點(diǎn)附加到選擇的方法:


選擇。追加(類型)<>


如果指定的類型是函數(shù),則對(duì)每個(gè)選定元素進(jìn)行評(píng)估,依次傳遞當(dāng)前數(shù)據(jù) ( d )、當(dāng)前索引 ( i ) 和當(dāng)前組 ( nodes ),并將this作為當(dāng)前 DOM 元素(節(jié)點(diǎn)[ i ])。這個(gè)函數(shù)應(yīng)該返回一個(gè)要追加的元素。


如果您想堅(jiān)持createNodeElement使用本機(jī) JS 方法創(chuàng)建元素的實(shí)現(xiàn),您可以簡單地將該函數(shù)傳遞給,selection.append()因?yàn)樗祷匾粋€(gè)新創(chuàng)建的節(jié)點(diǎn)及其<img>子節(jié)點(diǎn)。因此,您的代碼可以簡化為:


var nodes = g.selectAll("foreignObject")

    /* styling omitted */

  .append("xhtml:div")

    .attr("class", "outer")

  .append(createNodeElement);

因?yàn)橹挥袑?duì) DOM 節(jié)點(diǎn)的引用才會(huì)被傳遞到所有附加到元素的事件監(jiān)聽器也將被保留。


查看完整回答
反對(duì) 回復(fù) 2021-11-18
?
慕斯709654

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

createNodeElement函數(shù)中nodeOptionsImg元素尚未呈現(xiàn)時(shí)執(zhí)行addEventListener。偵聽器只能添加到渲染元素。


查看完整回答
反對(duì) 回復(fù) 2021-11-18
  • 2 回答
  • 0 關(guān)注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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