D3 通过索引 i 引用 svg 元素
D3 reference svg element by its index i
我可以根据索引引用 svg 元素吗?
例如,我可以做 d3.selectAll("circle").on("click", function(d, i) { console.log(i) }
,其中 i
是绘制的 ith
<circle>
。
但是,给定索引 i
,我如何引用 ith
<circle>
?
怎么直接像circle[i].attr("cx").attr("cy")
一样调用它来获取那个ith
圈子的属性?举例来说,如果我想要第 5 个圆的坐标,但实际上不知道是第 5 个圆的坐标,在这种情况下 i=5?
如何以这种方式引用元素?这可能吗?
来自处理程序
d3.selectAll("circle").on("click", function(d, i) { console.log(i) }
您可以访问通过 this
关键字单击的 <circle>
元素(您可以 console.log(this)
看到它)。
如果可以访问 DOM 元素,您现在可以 d3-select 它:
d3.selectAll("circle")
.on("click", function(d, i) {
d3.select(this).attr('fill', 'red');
}
此外,由于您拥有 DOM 节点,您还可以通过 this.parentNode
获取其父级,并且您可以 select 该父级的任何子级(即同级圈) .要select基于i
,你应该可以使用:nth-child
.
d3.selectAll("circle")
.on("click", function(d, i) {
d3.select(this.parentNode).select('circle:nth-child' + (i+1))
}
您还可以select所有兄弟圈子并根据它们的索引有条件地操作它们:
d3.selectAll("circle")
.on("click", function(d, i) {
d3.select(this.parentNode).selectAll('circle')
.attr('fill', function(dSibling, iSibling) {
if(iSibling != i) {
// Affects all sibling circles EXCEPT the clicked one
return 'red'
}
})
}
我可以根据索引引用 svg 元素吗?
例如,我可以做 d3.selectAll("circle").on("click", function(d, i) { console.log(i) }
,其中 i
是绘制的 ith
<circle>
。
但是,给定索引 i
,我如何引用 ith
<circle>
?
怎么直接像circle[i].attr("cx").attr("cy")
一样调用它来获取那个ith
圈子的属性?举例来说,如果我想要第 5 个圆的坐标,但实际上不知道是第 5 个圆的坐标,在这种情况下 i=5?
如何以这种方式引用元素?这可能吗?
来自处理程序
d3.selectAll("circle").on("click", function(d, i) { console.log(i) }
您可以访问通过 this
关键字单击的 <circle>
元素(您可以 console.log(this)
看到它)。
如果可以访问 DOM 元素,您现在可以 d3-select 它:
d3.selectAll("circle")
.on("click", function(d, i) {
d3.select(this).attr('fill', 'red');
}
此外,由于您拥有 DOM 节点,您还可以通过 this.parentNode
获取其父级,并且您可以 select 该父级的任何子级(即同级圈) .要select基于i
,你应该可以使用:nth-child
.
d3.selectAll("circle")
.on("click", function(d, i) {
d3.select(this.parentNode).select('circle:nth-child' + (i+1))
}
您还可以select所有兄弟圈子并根据它们的索引有条件地操作它们:
d3.selectAll("circle")
.on("click", function(d, i) {
d3.select(this.parentNode).selectAll('circle')
.attr('fill', function(dSibling, iSibling) {
if(iSibling != i) {
// Affects all sibling circles EXCEPT the clicked one
return 'red'
}
})
}