2 回答
TA贡献1827条经验 获得超7个赞
您的方法的主要问题是使用outerHTML和innerHTML(由 内部使用.html())来创建/移动/复制元素有点像序列化和反序列化您的 HTML DOM 树。这适用于 HTML 元素本身,但是,它不保留事件侦听器。因此,createNodeElement在此过程中,您附加到函数中元素的侦听器将丢失。这是其他问题的变体,例如“是否可以在不破坏后代事件侦听器的情况下附加到innerHTML?” .
如果您退后一步并重新阅读 D3 API文档,您会发现您实际上已经差不多了:D3 提供了将本机 DOM 节点附加到选择的方法:
选择。追加(类型)<>
如果指定的类型是函数,则对每个选定元素进行评估,依次传递当前数据 ( d )、当前索引 ( i ) 和当前组 ( nodes ),并将this作为当前 DOM 元素(节点[ i ])。这个函数应该返回一个要追加的元素。
如果您想坚持createNodeElement使用本机 JS 方法创建元素的实现,您可以简单地将该函数传递给,selection.append()因为它返回一个新创建的节点及其<img>子节点。因此,您的代码可以简化为:
var nodes = g.selectAll("foreignObject")
/* styling omitted */
.append("xhtml:div")
.attr("class", "outer")
.append(createNodeElement);
因为只有对 DOM 节点的引用才会被传递到所有附加到元素的事件监听器也将被保留。
TA贡献1840条经验 获得超5个赞
在createNodeElement
函数中nodeOptionsImg
元素尚未呈现时执行addEventListener
。侦听器只能添加到渲染元素。
添加回答
举报