d3.js - 如何插入新的兄弟元素

时间:2012-10-23 11:38:15

标签: javascript dom d3.js

我在将新兄弟姐妹插入现有元素方面遇到了问题。

我有这个结构

<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>

任何想法?

1 个答案:

答案 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);       
});​