javascript - 鼠标悬停在节点文本下划线

标签 javascript html css d3.js

我有一个用 d3.js 制作的图表,我有以下节点的属性:

 // Enter any new nodes at the parent's previous position
  var nodeEnter = node.enter().append("g")
      .attr("class", "node")
      .attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + d.y + ")"; })
      .on("click", click)
      .on("dblclick", dblclick)

我想添加将鼠标悬停在节点标题上时为其添加下划线的功能。不幸的是,这样的事情不起作用:

  var nodeEnter = node.enter().append("g")
      .on("mouseover").style("text-decoration","underline")
      .on("mouseout").style("text-decoration","none")

编辑:我更愿意提出一个条件,使这种情况只发生在图表的某些节点上。

最佳答案

您没有正确使用 selection.on() 方法。为了对事件执行某些操作,您需要为该方法提供第二个参数:一个描述对事件采取的操作的函数:

D3v6+

.on("mouseover", function(event, datum) { ... })

D3v5 及之前

.on("mouseover", function(datum, index, nodes) { ... })

在 D3 的所有版本中,this 都是目标元素(除非使用 arrow notation)。数据是绑定(bind)到目标元素的数据,传递给 selection.data() 的数组中的一项。

如果您只提供一个参数,它会返回分配给该事件的当前事件处理函数。在你的情况下,你可能还没有这样做(因为你正在尝试这样做),所以 .on("mouseover").style(...) 将返回一个错误,例如“找不到 null"的属性样式,因为 .on("mouseover") 将返回 null:没有分配给此事件的事件处理函数要返回。

因此,为了使用一些逻辑在鼠标悬停时突出显示节点,以便我们可以为不同的节点提供不同的结果,我们可以使用类似的东西:

 selection.on("mouseover", function(event, datum) {
   if(datum.property == "someValue") {
      d3.select(this).style("text-decoration","underline");
   }
 })
 .on("mouseout", function(event,datum) {
    d3.select(this).style("text-decoration","none");
 })

if 语句可以用您喜欢的任何逻辑替换。

我看到你可能正在使用分层布局生成器,D3 的分层布局生成器将原始数据的属性嵌套到数据属性中,这样布局属性和非布局属性就不会发生冲突,所以 datum.property可能位于 datum.data.property(如果遇到问题,请记录数据)。

var svg = d3.select("body")
  .append("svg");
  
var data = [
"Underline on mouse",
"Never underline"
];

svg.selectAll("text")
  .data(data)
  .enter()
  .append("text")
  .attr("x", 20)
  .attr("y", (d,i)=>i*50+40)
  .text(d=>d)
  .on("mouseover", function(event, datum) {
    if(datum == "Underline on mouse") {
      d3.select(this).style("text-decoration","underline");
   }
  })
  .on("mouseout", function(event,datum) {
    d3.select(this).style("text-decoration","none");
  })
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.0.0/d3.min.js"></script>

关于javascript - 鼠标悬停在节点文本下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69152193/

相关文章:

html - Android 浏览器中带有图像背景的链接

css - HTML/CSS : margin and padding values keep applying to entire div instead of just the text

javascript - 如何管理仅客户端的大型 Web 应用程序

html - 动态图像包装器的固定大小

javascript - 如何使画廊全宽?

javascript - <div> 标签未显示 Ajax 的 JSON 响应

javascript - 如何使用jQuery扩展折叠切换div层

javascript - 将事件绑定(bind)到尚未创建的元素 jquery

html - Bootstrap 3 输入填充问题

css - 将背景添加到 h1,仅在合适的空间上