Javascript d3.js树布局:展开一个节点时折叠其他节点?
在使用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
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);
}
例如,在上面的演示中,请尝试以下操作:
我怎样才能最好地处理这个问题?(当然,效率很高,因为我将使用一个相当大的数据集)一个简单的解决方案是修改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,您的解决方案看起来很棒,而且运行良好。但是,当我单击同级节点以展开它时,另一个(当前展开的)节点的子节点会随着动画一起塌陷,就像它们在单击的节点内塌陷一样。我们能纠正一下吗?