我正在创建一个网页,该网页将使用 JSON 文件中的数据制作 d3 强制布局图,当按下按钮时,系统将提示用户输入名称,并使用提供的名称创建一个新节点姓名。页面加载成功,当按下按钮时,警报会要求输入名称,但是当输入名称时,会出现错误,提示“未捕获的类型错误:未定义不是函数”,并且未添加新节点。
我可以做什么来修复这个错误?使用 Chrome,我知道错误发生在我尝试附加 newNode 的行中。这是我的代码:
<button onclick="addNode()">Click to add Node</button>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
function addNode() {
var nodeName = prompt("Name of new node:");
var newGroup = Math.floor(Math.random() * 6);
if (nodeName != null) {
var newNode = {"node":{"name":nodeName,"group":newGroup}};
force.nodes.append(newNode);
force.start();
}
}
var width = 960,
height = 500;
var color = d3.scale.category20();
var force = d3.layout.force()
.charge(-120)
.linkDistance(30)
.size([width, height]);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
d3.json("user_interactions(1).json", function(error, graph) {
force
.nodes(graph.nodes)
.links(graph.links)
.start();
var link = svg.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function(d) { return Math.sqrt(d.value); });
var node = svg.selectAll(".node")
.data(graph.nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", 5)
.style("fill", function(d) { return color(d.group); })
.call(force.drag);
node.append("title")
.text(function(d) { return d.name; });
force.on("tick", function() {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
});
</script>
最佳答案
force.nodes
是一个返回节点数组的函数。这不是属性(property)。所以 force.nodes.append
没有任何意义。您可能想将新节点添加到数据中,
force.nodes(force.nodes().push(newNode));
但是,我不确定 D3 是否能够优雅地动态处理节点数组的更改。
无论如何,您都必须为新节点添加 SVG 元素,并以类似于设置初始属性的方式指定其属性(r
、fill
等)
关于javascript - 将元素添加到 d3 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24147371/