我需要更改svg容器中由d3创建的所有形状的顺序。但我无法做到。 JSFiddle中的以下脚本在本地执行时会给出“a和b未定义”。应该如何纠正?如何在d3中对形状选择进行排序
var svg = d3.select("body")
.append("svg")
.attr("width", 100)
.attr("height", 100);
svg.append("rect")
.attr({x:0,y:0,height:10,width:10,fill:'yellow'})
.attr("sort",3);
svg.append("rect")
.attr({x:0,y:20,height:10,width:10,fill:'red'})
.attr("sort",2);
svg.append("rect")
.attr({x:0,y:40,height:10,width:10,fill:'blue'})
.attr("sort",1);
d3.selectAll("rect").sort(function(a,b){return a.attr("sort")-b.attr("sort")});
d3.selectAll("rect")
.each(function(d,i){alert(d3.select(this).attr("sort"))});
更好地尝试对数据集进行排序,然后调用selection.sort()对元素进行重新排序。 –
你是什么意思? – tic
'sort'里面的'a'和'b'不是对选择的引用(因此它们没有'.attr()'方法),它们是绑定到这些选择/元素的数据的引用。在你的情况下,'a'和'b'都是'null',因为你没有绑定数据。绑定数据涉及调用d3的'data()'方法,并使用'enter()'来处理它们的'append()'。说了这么多,排序只改变他们在DOM中的顺序,而不是在屏幕上(这是x和y的用途)。这是你的意图吗? – meetamit