Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3.js树布局:展开一个节点时折叠其他节点?_Javascript_Svg_D3.js - Fatal编程技术网

Javascript d3.js树布局:展开一个节点时折叠其他节点?

Javascript d3.js树布局:展开一个节点时折叠其他节点?,javascript,svg,d3.js,Javascript,Svg,D3.js,在使用d3.js()的树布局上,我希望折叠不在已单击的分支中的节点 function click(d) { if (d.children) { d._children = d.children; d.children = null; } else { d.children = d._children; d._children = null; } // If the node has a parent, then collapse its child

在使用d3.js()的树布局上,我希望折叠不在已单击的分支中的节点

function click(d) {
  if (d.children) {
    d._children = d.children;
    d.children = null;
  } else {
    d.children = d._children;
    d._children = null;
  }
  // If the node has a parent, then collapse its child nodes
  // except for this clicked node.
  if (d.parent) {
    d.parent.children.forEach(function(element) {
      if (d !== element) {
        collapse(element);
      }
    });
  }
  update(d);
}
例如,在上面的演示中,请尝试以下操作:

  • 单击“父1”(显示子1和子2)
  • 单击“子1”(显示子1.1)
  • 点击“儿童2”(显示儿童2.1)
  • 现在您应该看到“child1”和“child2”的子级

    我希望发生以下情况:

  • 单击“父1”(显示子1和子2)
  • 单击“子1”(显示子1.1)
  • 单击“儿童2”(显示儿童2.1,隐藏儿童1.1)
  • 因此,除了“活动”分支上的节点外,其他节点的子节点都应该隐藏


    我怎样才能最好地处理这个问题?(当然,效率很高,因为我将使用一个相当大的数据集)

    一个简单的解决方案是修改click函数,这样,如果节点有父节点,则父节点的子节点都会折叠,但前提是子节点不是被单击的节点

    function click(d) {
      if (d.children) {
        d._children = d.children;
        d.children = null;
      } else {
        d.children = d._children;
        d._children = null;
      }
      // If the node has a parent, then collapse its child nodes
      // except for this clicked node.
      if (d.parent) {
        d.parent.children.forEach(function(element) {
          if (d !== element) {
            collapse(element);
          }
        });
      }
      update(d);
    }
    

    更新的jsbin:

    如果只想在单击具有子节点的节点时折叠其他节点,请在第二个if中添加“&&d.children”

    function click(d) {
            if (d.children) {
              d._children = d.children;
              d.children = null;
            } 
            else {
              d.children = d._children;
              d._children = null;
            }
            if (d.parent && d.children) { //add here, 
              d.parent.children.forEach(function(element) {
            if (d !== element) {
            collapse(element);
            }});
          }
            update(d);
          }
    

    这就是我所追求的那种简单;我担心我会在所有地方重复,但事实上,在任何时候,只有父母的孩子才是重要的!谢谢。我很高兴,很高兴能帮上忙!当调用.json文件时,它不起作用,如果文件中的数据起作用,则不适用于外部。Json@mcbalaji,您的数据可能有问题。如果JSON是从远程源获取的,我想不出任何东西会使代码表现出不同的行为。请确保您考虑了外部请求的异步性质。@t.888,您的解决方案看起来很棒,而且运行良好。但是,当我单击同级节点以展开它时,另一个(当前展开的)节点的子节点会随着动画一起塌陷,就像它们在单击的节点内塌陷一样。我们能纠正一下吗?