如何使用 D3JS 在单击事件中显示数组元素

How to display array element on click event with D3JS

我刚开始学习 D3Js,我正在为一个基本概念而苦苦挣扎。

假设我有一个数组:

let arr = [a, b, c, d];

而且,我在 HTML

中有一个按钮
<input type="button" id="btn" value="Click">

使用d3js,我想打印出来(例如,console.log)按顺序一个一个地打印数组中的元素。换句话说,第一次单击按钮打印 'a',第二次单击 'b',等等,然后在点击最后一个元素后再次从 'a' 开始。

以下是我的尝试,但没有成功。

d3.select("#btn").data(arr).enter().on("click", function(d) { return console.log(d)});

有人可以帮助我了解如何使它正常工作吗?

谢谢。

如果我理解正确的话,我们可以很容易地做到这一点(有或没有 D3)。当您询问有关 D3 的问题时,我将展示一个解决方案。

您正在使用 .data() 和 .enter() - 当您想为数据数组中的每个项目(基准)创建一个元素时使用它们 - 但您只有一个元素,该元素已经存在。因为我们不需要输入任何东西,而且我们只有一个数据,所以这两种方法不是您要找的。 此外,enter 通常跟在 .append() 之后,它创建输入的元素 - 否则您不会将监听器分配给任何可点击的元素

相反,我们可以将包含值数组的单个数据绑定到按钮:

 .datum(arr)

但是,我们可以通过为当前索引包含一个 属性 来创建一个更有用的数据,这样我们需要的一切都是自包含的:

.datum({i:0,arr:arr})

然后我们可以为访问数据的按钮分配一个点击侦听器,记录 arr[i] 的值并递增 i。下面我使用模运算符来避免将 i 重置为 0:

let arr = ["a", "b", "c", "d"];

d3.select("input")
  .datum({i:0, arr:arr })
  .on("click", function(d) {
    console.log(d.arr[d.i++%d.arr.length])
  })
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<input type="button" id="btn" value="Click">