我在将新兄弟姐妹插入现有元素方面遇到了问题。
我有这个结构
<svg>
<g>
<path class="data"></path>
<path class="data"></path>
</g>
</svg>
并想要这个结构
<svg>
<g>
<path class="data"></path>
<text></text>
<path class="data"></path>
<text></text>
</g>
</svg>
但如果我使用d3.js插入函数
d3.select("g").insert("text", "path.data");
我得到以下内容(尽管按类名选择)
<svg>
<g>
<text></text>
<path class="data"></path>
<path class="data"></path>
</g>
</svg>
任何想法?
答案 0 :(得分:31)
首先,值得注意的是插入函数中的第二个参数是之前的选择器。此外,链式操作对左侧结果起作用。
所以你已经完成了
// select all the g elements (only 1)
d3.select("g")
// For each g, insert a text element before "path.data"
.insert("text", "path.data");
您希望为每个子项“.data”执行操作,因此您需要选择每个“.data”元素并为每个子元素执行操作。我不完全确定d3是否希望您在特定子项后插入元素。我发现使用DOM API更容易进行元素创建和插入,但使用d3.each函数迭代选择。
d3.selectAll("g > .data").each(function () {
var t = document.createElement('text');
this.parentNode.insertBefore(t, this.nextSibling);
});