在D3中取消对新创建的DOM元素的鼠标悬停

哈里·克莱默

我创建了一个DOM元素,当它触发鼠标悬停事件时,它会创建新的DOM元素,例如标签或工具提示。不幸的是,有时这些元素是在鼠标当前位置的下方创建的。这将导致触发该DOM元素的mouseleave事件,该事件通常负责删除新创建的DOM元素。

换句话说,创建新元素时,鼠标不再“悬停”在最初触发事件的DOM元素上,而是“悬停”在DOM元素上。浏览器将其读取为“ mouseleave”事件,然后触发“ mouseleave”功能。即使用户尚未移动鼠标,此事件也会发生,然后删除新元素。

这会导致出现一个循环,在该循环中迅速创建和删除新元素,并在将DOM元素的特定部分悬停在上方时引起闪烁效果。这是问题的简化版本:

https://jsfiddle.net/KingOfCramers/8wbfjap4/2/

var svg = d3.select("svg").style("background-color","grey")

var data = ["This is a circle"]

var circle = svg.selectAll("circle")
    .data(data)
  .enter()
  .append("circle")
    .attr("cx",100)
  .attr("cy",100)
  .attr("r", 20)
  .style("fill","red")


circle
.on("mouseover",function(d){
    var xPos = d3.select(this).attr("cx")
  var yPos = d3.select(this).attr("cy")
  svg
  .append("text").text(d)
  .attr("x",xPos)
  .attr("y",yPos)
})
.on("mouseleave",function(){
    d3.select("text").remove();
})

显然,此示例很愚蠢,但是在数据更加拥挤的情况下,仅将标签上下移动10或15像素是不切实际的解决方案。我也不能只创建相对于鼠标光标的标签,因为我经常会使用D3数据一次为多个DOM元素创建多个标签。大多数人会做什么来解决这个问题?

谢谢。

杰拉尔多·富塔多

如果您不需要与该新元素进行交互,只需使用pointer-events: none;

.attr("pointer-events", "none")

这是您所做的更改的代码:

var svg = d3.select("svg").style("background-color", "grey")

var data = ["This is a circle"]

var circle = svg.selectAll("circle")
  .data(data)
  .enter()
  .append("circle")
  .attr("cx", 100)
  .attr("cy", 100)
  .attr("r", 20)
  .style("fill", "red")


circle
  .on("mouseover", function(d) {
    var xPos = d3.select(this).attr("cx")
    var yPos = d3.select(this).attr("cy")
    svg
      .append("text").text(d)
      .attr("x", xPos)
      .attr("y", yPos)
      .attr("pointer-events", "none")
  })
  .on("mouseleave", function() {
    d3.select("text").remove();
  })
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width=500 height=500></svg>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

jQuery - 鼠标悬停/悬停等不适用于新创建的元素

D3鼠标悬停和鼠标悬停

在d3 v4中如何使用“单击,鼠标悬停,鼠标按下”等

使用D3在鼠标悬停时更改元素大小

DOM:使用onclick事件中的新创建的删除按钮删除新创建的“ article”元素?

D3 工具提示 + 鼠标悬停

鼠标悬停在d3上的工具提示

D3 鼠标悬停不触发

如何在D3中将鼠标悬停在更大的位置?

在传单地图上的d3中捕获鼠标悬停

如何在D3中的节点上绘制的饼图上添加鼠标悬停属性?

在饼图中使用鼠标悬停并在 d3 js 中显示标签

在d3中的烛台图中获取鼠标悬停时单个烛台的值

如何将鼠标悬停到D3中的线形图交互式

如何在D3中的地图上的鼠标悬停时显示多个值?

如何在d3中对项目执行鼠标悬停事件?

在D3 v6中,鼠标悬停时无法获取节点基准

如何在D3鼠标悬停中添加文本?

当我使用D3将鼠标悬停在第二个SVG的元素上时,如何更改SVG中的元素的属性

如何停止d3.drag在Chrome中触发鼠标悬停/鼠标悬停事件

在饼图中使用鼠标悬停并在 d3 v3 js 中显示标签

将鼠标悬停在d3中的图例上时,突出显示堆叠条形图中的相应图层

将鼠标悬停在强制布局d3中的节点上时连接的链接线动画

如何使用D3在鼠标悬停时模糊图像?

D3鼠标悬停时填充饼图段

当鼠标悬停在D3上时出现文本

如何在d3鼠标悬停期间获取信息

将鼠标悬停在事件行路径d3上

D3将鼠标悬停在节点链接图中的链接上,增加“接受”范围