Javascript 使用HTML输入更新数据值并更改数据数组
我想更新单击形状时在Javascript 使用HTML输入更新数据值并更改数据数组,javascript,d3.js,Javascript,D3.js,我想更新单击形状时在中显示的形状标签、x位置和y位置值。 用户编辑表单字段以根据需要更改值,然后单击提交将更改(如果有)写回JSON数组 我在矩形的“click”事件中构建了表单,该事件也会触发不透明度,以在页面顶部的中显示表单: .on("click", function(d){ d3.select("#rectInfo").style("opacity", 1); var infoForm = d3.select("#rectInfo").append("form") .a
中显示的形状标签、x位置和y位置值。
用户编辑表单字段以根据需要更改值,然后单击提交将更改(如果有)写回JSON数组
我在矩形的“click”
事件中构建了表单,该事件也会触发不透明度,以在页面顶部的
中显示表单:
.on("click", function(d){
d3.select("#rectInfo").style("opacity", 1);
var infoForm = d3.select("#rectInfo").append("form")
.attr("id", "foo")
.attr("action", "javascript:submitForm();")
.attr("method", "post")
.attr("class", "formEle");
显示器工作正常。但是,我不知道如何将表单中的值推回JSON数组。函数的作用是:只清除div修道院
function submitForm(){
d3.selectAll(".formEle").remove();
d3.select("#rectInfo").style("opacity", 0);
}
如何将表单中的值返回到JSON数组中?根据,您不会将此信息发送到任何地方。因此,您不需要表单
所以,只需将常规文本输入附加到该div
var div = d3.select("#rectInfo")
var labelText = div.append("p")
.text("Label: ");
var labelInput = labelText.append("input")
.attr("size", "15")
.attr("type", "text")
.attr("value", d.label);
var xPosText = div.append("p")
.text("X pos: ");
var xPosInput = xPosText.append("input")
.attr("size", "15")
.attr("type", "text")
.attr("value", d.x);
var yPosText = div.append("p")
.text("Y pos: ");
var yPosInput = yPosText.append("input")
.attr("size", "15")
.attr("type", "text")
.attr("value", d.y);
。。。并创建一个按钮,该按钮在“单击”时获取输入值,并更改x
、y
和标签的属性:
var button = div.append("button")
.text("Submit/Hide")
.on("click", function() {
d3.select(self).attr("x", function(d) {
return d.x = +xPosInput.node().value
}).attr("y", function(d) {
return d.y = +yPosInput.node().value
});
d3.select("#text" + i).text(function(d) {
return "Label: " + (d.label = labelInput.node().value);
})
.attr("x", function(d) {
return d.x = +xPosInput.node().value + 10
}).attr("y", function(d) {
return d.y = +yPosInput.node().value + 10
});
})
注意这个模式:
return d.x = +xPosInput.node().value
它做两件事:
它返回一个值(在本例中为+xPosInput.node().value
)李>
它将该值赋给d.x
,从而更改我们的数据
此外,即使用户键入一个数字,输入也会返回一个字符串。。。这就是为什么在上面的示例中,在xPosInput.node().value
之前有一个一元加号运算符的原因
最后,我不喜欢删除/重新添加元素(我说的是div)。你可以简单地更新它们。然而,正如我在另一个答案中告诉你们的,这是一个不同的问题,在S.O.这里,我们试图每个问题只保留一个问题(因此,我在这个答案中不涉及它)
以下是您的代码和这些更改:
var rectInfoActive=false;
变量rectData=[{
“标签”:“一个”,
“x”:100,
“y”:50,
“高度”:100,
“宽度”:120,
“颜色”:“绿色”
}, {
“标签”:“两个”,
“x”:250,
“y”:50,
“高度”:100,
“宽度”:120,
“颜色”:“紫色”
}, {
"标签":"三",,
“x”:400,
“y”:50,
“高度”:100,
“宽度”:120,
“颜色”:“红色”
}];
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,600)
.attr(“高度”,200);
var rects=svg.selectAll(“rect”)
.数据(rectData)
.输入()
.附加(“g”);
rects.append(“rect”)
.attr(“x”,函数(d){
返回d.x;
})
.attr(“y”,函数(d){
返回d.y;
})
.attr(“高度”,功能(d){
返回d.高度;
})
.attr(“宽度”,函数(d){
返回d.width;
})
.样式(“填充”,功能(d){
返回d.color;
})
.on('mouseover',函数(d){
var rectSelection=d3.选择(此)
.风格({
不透明度:“0.5”
})
})
.on('mouseout',函数(d){
var rectSelection=d3.选择(此)
.风格({
不透明度:“1”
})
})
.on(“点击”),功能(d,i){
var self=这个;
if(rectInfoActive==true){
//在显示上一个信息块时单击了一个节点
d3.选择全部(“输入”)。删除();
d3.选择全部(“.formEle”).remove();
d3.选择(“#rectInfo”).selectAll(“*”).remove();
d3.选择(“#rectInfo”).style(“不透明度”,0);
}
d3.选择(“#rectInfo”).style(“不透明”,1);
//在/div中显示的表单在单击rect时变为可见。
//“提交”按钮清除表单。尚未更新数据。
var div=d3。选择(“rectInfo”)
var labelText=div.append(“p”)
.text(“标签:”);
var labelInput=labelText.append(“输入”)
.attr(“尺寸”、“15”)
.attr(“类型”、“文本”)
.attr(“值”,d.标签);
var xPosText=div.append(“p”)
.文本(“X位置:”);
var xPosInput=xPosText.append(“输入”)
.attr(“尺寸”、“15”)
.attr(“类型”、“文本”)
.attr(“值”,d.x);
var yPosText=div.append(“p”)
.文本(“Y位置:”);
var yPosInput=yPosText.append(“输入”)
.attr(“尺寸”、“15”)
.attr(“类型”、“文本”)
.attr(“价值”,d.y);
var按钮=div.append(“按钮”)
.text(“提交/隐藏”)
.on(“单击”,函数(){
d3.选择(自).attr(“x”,函数(d){
返回d.x=+xPosInput.node().value
}).attr(“y”,函数(d){
返回d.y=+yPosInput.node().value
});
d3.选择(“#文本”+i)。文本(功能(d){
返回“Label:”+(d.Label=labelInput.node().value);
})
.attr(“x”,函数(d){
返回d.x=+xPosInput.node().value+10
}).attr(“y”,函数(d){
返回d.y=+yPosInput.node().value+10
});
d3.选择(“#rectInfo”).selectAll(“*”).remove();
d3.选择(“#rectInfo”).style(“不透明度”,0);
})
rectInfoActive=true;
});
//形式结束
//矩形标签
rects.append(“文本”)
.attr(“id”,函数(d,i){
返回“text”+i
})
.样式(“填充”、“黑色”)
.attr(“dy”,“.35em”)
.attr(“x”,函数(d){
返回d.x+10;
})
.attr(“y”,函数(d){
返回d.y+10;
})
.文本(功能(d){
return“Label:+d.Label
});
//杂项功能-------------------------------------------------------------
//清除模板----
//清除表单和输入值。这将在以后成为更新函数
//这将把更改后的值更新回JSON数组。
#rectInfo{
背景色:白色;
位置:相对位置;
填充:10px;
宽度:230px;
高度:100px;
边界:2px;
轮廓:灰色实薄;
}
#rectinfop{
保证金:4倍;
}
.formLabel{
字体系列:信使;
}
为什么要使用表单?你要把这些数据发送到其他地方吗?在我看来,您只是想更改加载的数据。。。如果这是正确的,你不应该使用表单。你是正确的。我只想更新数据,不需要是表单。数据保留在页面中。在我之前的帖子()中,你说我的问题太广泛,所以我进一步发展了m