D3 v3追加复选框?

时间:2013-10-09 04:56:49

标签: javascript html svg d3.js

使用可折叠树从上到下取向。在这里我遇到了一些问题。 使用d3.v3.js实现树。如何将复选框附加到每个节点的树中。

    // Create the link lines.
    svg.selectAll(".link")
        .data(links)
      .enter().append("path")
        .attr("class", "link")
        .attr("d", d3.svg.diagonal().projection(function(d) { return [o.x(d)+15, o.y(d)]; }));

        svg.selectAll("input")
        .data(nodes)
        .enter().append("foreignObject")
        .attr('x' , o.x)
        .attr('y',  o.y)
        .attr('width', 50)
        .attr('height', 20)
        .append("xhtml:body")
        .html("<form><input type=checkbox id=check></input></form>")
     .on("click", function(d, i){
            console.log(svg.select("#check").node().checked) 
            }) ;

    svg.selectAll("image")
        .data(nodes)
     .enter().append("image")
        .attr('x' , o.x)
        .attr('y',  o.y)
        .attr('width', 30)
        .attr('height', 20)
        .attr("xlink:href", "check.png")
  }); 
});

复选框附加到svg但在浏览器中不可见。有人请帮我解决这个问题

3 个答案:

答案 0 :(得分:3)

您需要为foreignObjects创建一个holder(即复选框),而不是此行中的输入:

svg.selectAll("input")

应该是

svg.selectAll("foreignObject")

然后,您需要使用data(data)中的数据来驱动复选框的数量,并将其与enter()绑定,就像您所做的那样。如果要显示多个元素,则需要对x和y使用动态变量。在一个简单的例子中,.attr('x', function (d,i) { return d.x; })。所以把它们放在一个小提琴里,你得到this

答案 1 :(得分:1)

您的复选框未显示,因为您无法将任意html元素附加到svg。你应该使用&lt; g>或浮动元素:

#canvas {
  position: relative;
}

然后使用:

附加复选框元素
d3.select("#canvas")
  .append("input")
  .attr("type", "checkbox")
  .style("position", "absolute")
  .style("top", "320")
  .style("left", "150")

答案 2 :(得分:0)

这个答案对于那些使用 Bootstrap 更有用。在bootstrap中附加复选框我们需要在追加外国时指定标签 span 宾语。否则它在浏览器中不可见

 svg.selectAll("foreignObject")
   .data(nodes).enter()
   .append("foreignObject")
   .attr('x', o.x)
   .attr('y',  o.y)
   .attr('width', 30)
   .attr('height', 20)
   .append("xhtml:tree")
   .html("<label class='inline'><input type='checkbox'><span class='lbl'> </span>               </label>");