Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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中向数组添加元素_Javascript_D3.js_Force Layout - Fatal编程技术网

Javascript 在d3中向数组添加元素

Javascript 在d3中向数组添加元素,javascript,d3.js,force-layout,Javascript,D3.js,Force Layout,我正在创建一个网页,该网页将使用JSON文件中的数据生成d3 force布局图,当按下按钮时,将提示用户输入名称,并使用提供的名称创建一个新节点。页面加载成功,按下按钮时会发出警报,要求输入名称,但输入名称时会出现错误,显示“Uncaught TypeError:undefined不是函数”,并且不会添加新节点 我可以做什么来修复此错误?使用Chrome,我知道错误发生在我尝试附加newNode的行中。这是我的密码: <button onclick="addNode()">Click

我正在创建一个网页,该网页将使用JSON文件中的数据生成d3 force布局图,当按下按钮时,将提示用户输入名称,并使用提供的名称创建一个新节点。页面加载成功,按下按钮时会发出警报,要求输入名称,但输入名称时会出现错误,显示“Uncaught TypeError:undefined不是函数”,并且不会添加新节点

我可以做什么来修复此错误?使用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>
单击以添加节点
函数addNode(){
var nodeName=prompt(“新节点的名称:”);
var newGroup=Math.floor(Math.random()*6);
if(nodeName!=null){
var newNode={“node”:{“name”:nodeName,“group”:newGroup};
force.nodes.append(newNode);
force.start();
}
}
可变宽度=960,
高度=500;
var color=d3.scale.category20();
var-force=d3.layout.force()
。收费(-120)
.linkDistance(30)
.尺寸([宽度、高度]);
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度);
d3.json(“用户交互(1.json)”,函数(错误,图形){
力
.nodes(图.nodes)
.links(graph.links)
.start();
var link=svg.selectAll(“.link”)
.数据(图表.链接)
.enter().append(“行”)
.attr(“类”、“链接”)
.style(“笔划宽度”,函数(d){return Math.sqrt(d.value);});
var node=svg.selectAll(“.node”)
.数据(图.节点)
.enter().append(“圆”)
.attr(“类”、“节点”)
.attr(“r”,5)
.style(“fill”,函数(d){返回颜色(d.group);})
.呼叫(强制拖动);
node.append(“标题”)
.text(函数(d){返回d.name;});
force.on(“勾号”,函数(){
attr(“x1”,函数(d){返回d.source.x;})
.attr(“y1”,函数(d){返回d.source.y;})
.attr(“x2”,函数(d){返回d.target.x;})
.attr(“y2”,函数(d){返回d.target.y;});
attr(“cx”,函数(d){return d.x;})
.attr(“cy”,函数(d){返回d.y;});
});
});

force.nodes是一个返回节点数组的函数。这不是财产。因此,
force.nodes.append
没有任何意义。您可能希望将新节点添加到数据中

force.nodes(force.nodes().push(newNode));
但是,我不确定D3是否能够优雅地处理动态更改节点数组的问题

在任何情况下,您都必须为新节点添加SVG元素,并以与设置初始属性类似的方式指定它们的属性(
r
fill
,等等)