javascript - 将鼠标单击处理程序分配给具有捕捉行为的 d3 中的行

标签 javascript events d3.js mouse

我有一条只有一个像素宽的 d3 线。我想要一个点击 分配给这条线的处理程序。但是,在尝试选择它时很难准确地位于该行的顶部。是否有一些“选择走廊”功能可以让您指定“到线的距离”。 IE。如果鼠标指针距离线最大 8pt 的距离并且单击鼠标,则会触发 click 事件?

最佳答案

other answer 中的解决方案是一个很好的解决方案,也是一个有趣的解决方案。

不过,我更喜欢“传统”的解决方案,即绘制另一线,透明且比可见的细线更粗,只是为了捕捉点击事件。我更喜欢这种“传统”解决方案(D3 编码器中最常见的解决方案)的原因是用户体验:让用户知道她/他可以单击该行是个好主意。

因此,在可见的细线上使用较粗的透明线的优点是您可以将光标设置为手...

.attr("cursor", "pointer")

...当用户将鼠标悬停在透明线上时。

这是一个简单的演示:

var svg = d3.select("svg");
var data = d3.range(30).map(function(d) {
  return {
    x: d * 10,
    y: Math.random() * 150
  }
});
var lineGenerator = d3.line()
  .x(function(d) {
    return d.x
  })
  .y(function(d) {
    return d.y
  });

var realLine = svg.append("path")
  .attr("stroke", "teal")
  .attr("fill", "none")
  .attr("stroke-width", 1)
  .attr("d", lineGenerator(data));

var transparentLine = svg.append("path")
  .attr("stroke", "teal")
  .attr("fill", "none")
  .attr("stroke-width", 12)
  .attr("opacity", 0)
  .attr("cursor", "pointer")
  .attr("d", lineGenerator(data));

transparentLine.on("click", function() {
  console.log("clicked")
})
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

当然,这种“传统”解决方案只有在该图表上有一条或几条线时才有意义。如果你有几十行或几百行,那将是一团糟。

关于javascript - 将鼠标单击处理程序分配给具有捕捉行为的 d3 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44248907/

相关文章:

javascript - 在递归函数中获取 "variable is undefined return Proxy"

c# - 使用户控件内的标签对于所有鼠标事件都可单击?

android - 在 Android/AndEngine 中触发一个事件?

javascript - Axis 和 svg 文本元素相互隐藏

javascript - 如何从键值对数组中获取对象数组

javascript - 使用参数链接到路线的正确方法是什么?

javascript - 如何获取与数组具有相同名称标签的所有输入字段(jQuery)

jquery - 主干事件不绑定(bind)到动态添加的内容

javascript - 获取受区域限制的 svg 元素 - javascript

HTML SVG : show element on top of all elements