为什么这个树布局给我一个无限循环?

时间:2013-07-19 21:11:51

标签: javascript d3.js

我是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_treeRightd3_layout_treeLeft方法(我认为它们分别试图找到第一个子节点和最后一个子节点)只是在当前节点是叶子时返回当前节点。

node._tree.thread的值是d3_layout_treeRightd3_layout_treeLeft内的当前节点。所以对这些方法的调用返回作为参数传入的节点。

1 个答案:

答案 0 :(得分:0)

d3-js google group所述,问题在于我使用了beanNode.getElementsByTagName("*")而不是beansNode.childNodes