使用 d3.selectAll() 按索引选择多个 dom 元素
Selecting multiple dom elements by index with d3.selectAll()
我遇到了一个问题,我尝试使用 d3.selectAll() select 特定的 DOM 元素。例如,假设我有以下数据集。
const dataset = [3, 7, 9, 5, 4]
现在,我想从这个数据集创建 SVG 圆圈
d3.selectAll("circle").data(dataset).join("circle").attr("r", 2).attr("cx", (d,i) => i * 10).attr("cy", 100)
假设我有一个带有事件监听器的按钮,它应该 select 运行dom 个这些圆圈并更改它们的填充值。我该如何实施?
const button = document.querySelector("button")
button.addEventListener("click", () => {
// what should the code be here?
}
我尝试了 How to access the DOM element that correlates to a D3 SVG object? 的一些建议,但这些建议仅适用于单个 dom 元素。有没有办法通过索引 select 多个 DOM 元素?
不幸的是,您的问题标题与您的示例之间存在不一致:在标题和最后一段中,您询问如何通过索引 select 元素 ,而在示例中您询问 如何 select 随机数量的元素 。所以我只回答标题问题。
在 D3 selections 中,传递给大多数 selections 方法的第二个参数是索引。因此,假设您有所需的索引,例如...
[1, 4, 5, 7]
...您只需使用filter
、each
或任何其他直接方法来更改您的元素。这是一个简单的例子,circles
是我的圆 selection,我根据索引数组更改它们的填充:
const circles = d3.select("svg")
.selectAll(null)
.data(d3.range(10))
.enter()
.append("circle")
.attr("r", 10)
.attr("cx", (_, i) => i * 25 + 10)
.attr("cy", 40);
const indicesArray = [1, 4, 5, 7];
circles.filter((_, i) => indicesArray.includes(i))
.style("fill", "tan");
<script src="https://d3js.org/d3.v7.min.js"></script>
<svg></svg>
我遇到了一个问题,我尝试使用 d3.selectAll() select 特定的 DOM 元素。例如,假设我有以下数据集。
const dataset = [3, 7, 9, 5, 4]
现在,我想从这个数据集创建 SVG 圆圈
d3.selectAll("circle").data(dataset).join("circle").attr("r", 2).attr("cx", (d,i) => i * 10).attr("cy", 100)
假设我有一个带有事件监听器的按钮,它应该 select 运行dom 个这些圆圈并更改它们的填充值。我该如何实施?
const button = document.querySelector("button")
button.addEventListener("click", () => {
// what should the code be here?
}
我尝试了 How to access the DOM element that correlates to a D3 SVG object? 的一些建议,但这些建议仅适用于单个 dom 元素。有没有办法通过索引 select 多个 DOM 元素?
不幸的是,您的问题标题与您的示例之间存在不一致:在标题和最后一段中,您询问如何通过索引 select 元素 ,而在示例中您询问 如何 select 随机数量的元素 。所以我只回答标题问题。
在 D3 selections 中,传递给大多数 selections 方法的第二个参数是索引。因此,假设您有所需的索引,例如...
[1, 4, 5, 7]
...您只需使用filter
、each
或任何其他直接方法来更改您的元素。这是一个简单的例子,circles
是我的圆 selection,我根据索引数组更改它们的填充:
const circles = d3.select("svg")
.selectAll(null)
.data(d3.range(10))
.enter()
.append("circle")
.attr("r", 10)
.attr("cx", (_, i) => i * 25 + 10)
.attr("cy", 40);
const indicesArray = [1, 4, 5, 7];
circles.filter((_, i) => indicesArray.includes(i))
.style("fill", "tan");
<script src="https://d3js.org/d3.v7.min.js"></script>
<svg></svg>