作为更大项目的一部分,我想从点击处理程序中更新 SVG 行的属性,然后在仍在回调中使用该属性。我是 d3 的新手,对 javascript 没有太多经验,所以我怀疑我可能对它在语言中的工作方式有一些基本的误解。
我把它提炼成一个简单的例子:
var lines = [
{ "x1": 50, "y1": 50, "x2": 350, "y2": 150 },
{ "x1": 50, "y1": 150, "x2": 350, "y2": 50 }
];
var svg = d3.select("body")
.append("svg")
.attr("width", 400)
.attr("height", 200);
var lines = svg.selectAll("line")
.data(lines)
.enter().append("line")
.attr("x1", function(d){return d.x1;})
.attr("y1", function(d){return d.y1;})
.attr("x2", function(d){return d.x2;})
.attr("y2", function(d){return d.y2;})
.attr("stroke-width", 2)
.attr("stroke", "#00b000");
lines.on("click", function () {
svg.selectAll("line")
.attr("val", 10);
svg.selectAll("line")
.attr("stroke", "#b000b0")
.attr("stroke-width", function(d) { return d.val; });
});
我在jsfiddle中创建了它来演示。
在点击处理程序中,我正在更新“val”属性,然后尝试使用该属性来设置笔画宽度。我的期望是单击线条时,笔划宽度将更改为 10,但它似乎更改为 1。
有没有办法使这项工作?我知道在这个简单的示例中,我可以直接将 stroke-width 设置为 10,但我想了解为什么我不能在该函数中使用 val 属性。
此外,欢迎在任何部分提出更好风格的建议。