D3.js - 为什么mouseover和mouse out为每个子元素触发?

Gin*_*Jim 14 javascript d3.js

我使用d3.js在圆圈中间生成带有文本徽标的svg圆圈.这是svg的结果.

<g id="main">
  <circle r="114" fill="#F0E8D0"></circle>
  <text text-anchor="middle">The movie title</text>
</g>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是d3.js

var circles = [{r: innerRadius}];
svg.append("g").attr("id","main");


svg.select("#main").selectAll("circle")
.data(circles).enter()
.append("circle")
.attr("r",function(d){return d.r})
.attr("fill","#F0E8D0");

svg.select("#main").append("text")
.attr("text-anchor", "middle")
.text(function(){ return "The movie title";});
Run Code Online (Sandbox Code Playgroud)

当鼠标悬停并离开圆圈时,我也想要激活一些动画.

svg.select("#main")
.on("mouseover",function(){
  //code for transition
}).on("mouseout",function(){
  //code for transition
})
Run Code Online (Sandbox Code Playgroud)

所以问题是:当鼠标移动到圆圈时,动画会按预期触发,但是,当鼠标触摸文本元素时,会发生mouseout事件(鼠标离开圆圈),然后再次发生鼠标悬停事件(鼠标进入文本元素) ),这是不可取的.

当鼠标触摸"<g>"标签的任何子元素时,似乎将调用动画回调.

当鼠标触摸文本元素时,我不希望发生任何动画.我该怎么做?

Avi*_*bey 28

另一种解决方案是使用mouseentermouseleave不是mouseovermouseout.

mouseenter类似于mouseover除了当指针(鼠标)从一个监听器(在这种情况下是圆圈)后代的物理空间(在这种情况下为文本)移动到其自己的物理空间时不触发它.

'mouseleave'的相同推理

来源:https://developer.mozilla.org/en-US/docs/Web/Events/mouseenterhttps://developer.mozilla.org/en-US/docs/Web/Events/mouseleave


Lar*_*off 17

您可以text通过设置pointer-eventsnone:阻止元素接收鼠标事件(因此当您将鼠标移到鼠标上时触发鼠标输出事件):

svg.select("#main").append("text")
   .attr("text-anchor", "middle")
   .attr("pointer-events", "none")
   .text(function(){ return "The movie title";});
Run Code Online (Sandbox Code Playgroud)

您可能还希望circleg元素上而不是在元素上设置事件:

svg.select("#main").selectAll("circle")
   .data(circles).enter()
   .append("circle")
   .attr("r",function(d){return d.r})
   .attr("fill","#F0E8D0")
   .on("mouseover",function(){
     //code for transition
   })
   .on("mouseout",function(){
     //code for transition
   })
Run Code Online (Sandbox Code Playgroud)