1

私はd3が初めてで、いくつかのxmlデータに対して単純なツリーレイアウトを実行しようとしています. 一部の d3 コードで無限ループが発生し、その理由を突き止めようとしています。これは私がやっていることを単純化したもので、まだ無限ループが見られます。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring Integration Inspector</title>
<script src="js/d3.js"></script>
<script type="text/javascript">
var parser = new DOMParser();
var xml = parser.parseFromString("<beans><bean/><bean><beanChild/></bean></beans>", "text/xml");

var tree = d3.layout.tree().children(function(beanNode) {
    var children = beanNode.getElementsByTagName("*");
    if (children.length > 0) {
        return children;
    } else {
        return null;    
    }
});

var nodes = tree.nodes(xml),
    links = tree.links(nodes);
</script>
</head>
<body>
<div id="graph"></div>
</body>
</html>

再現するには、このコードをindex.htmlファイルにコピーし、d3.js ライブラリを適切に含めます。これはブラウザに読み込まれません。私はそれが子供の機能と関係があると思います。


編集:

Chrome でデバッガーをステップ実行していますが、問題はapportionメソッド内にあります。while ループが壊れることはありません。より具体的には、d3_layout_treeRightandd3_layout_treeLeftメソッド (それぞれ最初の子と最後の子を見つけようとしていると思います) は、現在のノードがリーフの場合に現在のノードを返すだけです。

の値は、とnode._tree.thread内の現在のノードです。したがって、これらのメソッドを呼び出すと、引数として渡されたノードが返されます。d3_layout_treeRightd3_layout_treeLeft

4

1 に答える 1