2

我正在尝试实现圆形包装示例:http ://bl.ocks.org/4063530 - 但我希望它使用嵌套的“g”节点,以便更轻松地设置和控制每个圆形子级的可见性 - 但在在这个例子中,所有节点在 dom 中的深度相同。我如何嵌套它们?或者,如果不是嵌套,我如何只选择一个圆圈的直接子级(不是所有圆圈的所有子级)。我目前已修改示例以添加具有对象深度的类,如下所示:

d3.json("skills.json", function(error, root) {
  var node = svg.datum(root).selectAll(".node")
    .data(pack.nodes)
    .enter().append("g")
      .attr("class", function(d) { return "node node"+ d.depth; })

现在想这样做:

d3.selectAll(".node1").on("mouseover",function(){
    d3.select(this).classed("active",true).//SELECT ALL CHILDREN OF THE HOVERED NODE HERE

有人有想法么?

4

1 回答 1

2

在 ing 数据之后,我无法想出一种嵌套 g 元素pack的方法,所以这是一个不太优雅的解决方案:

  function checkParent(d, w) {
      if(!d.parent) return false;

      if(d.parent == w) {
        return true;
      } else {
        return checkParent(d.parent, w);
      }
  }

  node.on("mouseover",function(d){
      d3.select(this).classed("active",true);
      d3.selectAll(".node")
          .filter(function(w){ return checkParent(w, d); })
          .classed("active",true);
  });

  node.on("mouseout",function(d){
      d3.select(this).classed("active",false);
      d3.selectAll(".node")
          .filter(function(w){ return checkParent(w, d); })
          .classed("active",false);
  });

http://bl.ocks.org/4771875

于 2013-02-12T18:06:29.540 回答