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)聽器也將被保留。

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
在createNodeElement
函數(shù)中nodeOptionsImg
元素尚未呈現(xiàn)時(shí)執(zhí)行addEventListener
。偵聽器只能添加到渲染元素。
添加回答
舉報(bào)