捕获两个重叠元素上的鼠标悬停事件

2023-12-31

所以我有一个 d3 图表rect覆盖以固定十字准线元素mouseover事件。在覆盖层下,我有其他显示数据的矩形mouseover事件处理程序也是如此,但是覆盖层被阻塞mouseover事件在下面的子矩形上形成触发器。

let chartWindow = svg
  .append("g");

/* this holds axis groups, and cadlestick group*/
let candleStickWindow = chartWindow.append("g")
  //this event never fires
  .on('mousemove', ()=>console.log('mouse move'));

let candlesCrosshairWindow = chartWindow
  .append("rect")
  .attr("class", "overlay")

  .attr("height", innerHeight)
  .attr("width", innerWidth)
  .on("mouseover", function() {
    crosshair.style("display", null);
  })
  .on("mouseout", function() {
    crosshair.style("display", "none");
    removeAllAxisAnnotations();
  })
  .on("mousemove", mousemove);

The CrosshairWindow具有 CSS 属性pointer-events: all。如果我删除它,我的事件就会在candleStickWindow但不是CrosshairWindow。如何将鼠标事件获取到这两个元素上?

谢谢你的帮助!

Update我将十字线矩形元素更改为位于底部,它有点起作用,烛台条形鼠标悬停事件起作用,但它阻止了十字线工作。


我想到的一种解决方案可能会使用事件冒泡 https://javascript.info/bubbling-and-capturing然而,只有当事件可以沿着同一个 DOM 子树冒泡时,这才有效。如果在您的 DOM 结构中,十字准线矩形和其他元素不共享您可以使用的共同祖先合理地附加这样的侦听器,您需要重新考虑您的 DOM 或诉诸其他解决方案。对于这个答案,我将提出一种更普遍适用的替代方法。

您可以将全尺寸的rect在你的 SVG 的最底部并有它的pointer-events set to all。这样您就可以轻松附加一个mousemove处理程序来控制十字准线在整个视口中的移动。然而,正如您自己所注意到的,如果上面的元素附加了针对特定事件类型的侦听器,则此方法不起作用。因为在这种情况下,一旦事件到达其目标,就无法将其进一步传播到底层矩形来处理十字准线组件。不过,解决方法很简单,因为您可以克隆事件并将新事件直接分派到您的矩形。

克隆事件是通过使用MouseEvent() https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent构造函数传入事件的详细信息d3.event参考:

new MouseEvent(d3.event.type, d3.event)

然后,您可以将新创建​​的事件对象分派到十字准线rect元素通过使用.dispatchEvent() https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent的方法EventTarget https://developer.mozilla.org/en-US/docs/Web/API/EventTarget接口是由SVGRectElement https://developer.mozilla.org/en-US/docs/Web/API/SVGRectElement:

.dispatchEvent(new MouseEvent(d3.event.type, d3.event));

由于您的问题中缺乏完整的示例,我自己设置了一个工作演示来说明该方法。您可以拖动蓝色圆圈,这是十字准线组件的精简版本。请注意,即使在橙色矩形下方,圆也可以无缝移动。为了演示附加到这些小矩形的事件处理程序,当使用鼠标指针进入或离开它们时,它们将转换为绿色并返回橙色。

const width = 500;
const height = 500;
const radius = 10;
const orange = d3.hsl("orange");
const steelblue = d3.hsl("steelblue");
const limegreen = d3.hsl("limegreen");

const svg = d3.select("body")
  .append("svg")
    .attr("width", width)
    .attr("height", height);
    
const target = svg.append("rect")
    .attr("x", 0)
    .attr("y", 0)
    .attr("width", width)
    .attr("height", height)
    .attr("fill", "none")
    .attr("pointer-events", "all")
    .on("mousemove", () => {
      circle.attr("cx", d3.event.clientX - radius);
      circle.attr("cy", d3.event.clientY - radius);
    });

const circle = svg.append("circle")
    .attr("r", radius)
    .attr("fill", steelblue)
    .attr("pointer-events", "none");
    
const rect = svg.selectAll(null)
  .data(d3.range(3).map(d => [Math.random() * width, Math.random() * height]))
  .enter().append("rect")
    .attr("x", d => d[0])
    .attr("y", d => d[1])
    .attr("width", 50)
    .attr("height", 50)
    .attr("fill", orange)
    .attr("opacity", 0.5)
    .on("mouseover", function() { 
      d3.select(this).transition().attr("fill", limegreen);
    })
    .on("mousemove", function() { 
      target.node().dispatchEvent(new MouseEvent(d3.event.type, d3.event));
    })
    .on("mouseout", function() { 
      d3.select(this).transition().attr("fill", orange);
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获两个重叠元素上的鼠标悬停事件 的相关文章

  • 使 D3 响应式:viewBox 与 resize()?

    我必须构建在平板电脑 桌面显示器以及某些情况下非常大的 4k 高分辨率影院尺寸显示器上都能正常运行的 d3 可视化效果 因此 我试图找出使用 SVG 的 viewBox 属性和 preserveaspectratio 与调用调整大小函数以在
  • SVG 中虚线的悬停事件

    带有线 或路径 的 SVG 使用stroke dasharray当用户将鼠标悬停在虚线的实心部分上时 似乎只会触发 CSS 和 JS 悬停事件 https codepen io anon pen YeXoZy https codepen i
  • Blazor / SVG 实时更新

    我正处于使用 Blazor 开发实时 Web 应用程序的早期阶段 目的是在网页上显示与某些设备的状态有关的实时状态更新 它是机器的 HMI 可以将其视为具有实时数据更新的仪表板 机器的图形模型将使用 SVG 完成并托管在应用程序中 我正在尝
  • d3.js 强制布局是否允许动态 linkDistance?

    我使用力布局来表示有向未加权网络 我的灵感来自以下例子 http bl ocks org mbostock 1153292 http bl ocks org mbostock 1153292 我的问题是 在我的情况下 节点之间有更多的链接
  • SVG定位

    我正在使用 SVG 但在定位方面遇到了一些问题 我有一系列形状包含在g组标签 我希望像容器一样使用它 这样我就可以设置它的 x 位置 然后该组中的所有元素也会移动 但这似乎不可能 大多数人如何定位您希望串联移动的一组元素 有相对定位的概念吗
  • Javascript 将对象推送为克隆

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • 使用 CSS 更改 svg 图像的颜色 [重复]

    这个问题在这里已经有答案了 我的 html 文件中有以下 svg 图像 img class svg src my image link svg 现在 我尝试使用以下 css 代码更改颜色 svg path fill black 然而 一切都
  • Jest/Enzyme SVG Sprites 意外令牌 <

    我在使用 SVG 精灵在组件上使用 Jest 和 Enzyme 创建快照测试时遇到问题 我正在使用 svg sprite loader 包 https github com kisenka svg sprite loader https g
  • 合并两个 csv (d3)

    我使用以下代码加载两个 csv 文件 d3 csv sqrt100train csv function error data2 d3 csv sqrt100test csv function error data sqrt100train
  • 当我“显示:无”一个 SVG 时,另一个(独立的)SVG 会以不同的方式呈现

    我已经伤透了几个小时了 这没有任何意义 我将遇到的问题减少到这个codepen https codepen io Octopous pen OJORpJQ https codepen io Octopous pen OJORpJQ HTML
  • 转换 SVG 过滤器

    我正在尝试创建一个像 SVG 圆圈上的阴影这样的材质设计 我希望当您单击圆圈时 这个阴影能够以良好的过渡来增长 但目前我正在努力弄清楚是否可以为这种过渡设置动画 所以我希望有人能够提供帮助 我添加了一个到目前为止所得到的小例子 一个带有阴影
  • 在 d3.js 中换行长文本

    我想将长文本元素换行为宽度 这里的例子取自博斯托克的wrap功能 http bl ocks org mbostock 7555321 但似乎有两个问题 首先 wrap的结果没有继承元素的x值 文本左移 其次它绕在同一条线上 并且lineHe
  • 在 SVG 中设置悬停语句样式

    我正在计划一个基于这个 SVG 插图的网络 菜单 我的想法的原则 一个样式为活动的圆圈 一个样式为悬停的圆圈以及一个也需要设置样式的伴随笔画 https i stack imgur com H397o png 当我阅读 SVG 文件的规范时
  • 快速响应的交互式图表/图形:SVG、Canvas 还是其他?

    我正在尝试选择正确的技术来更新一个项目 该项目基本上在可缩放 可平移的图表中渲染数千个点 当前使用 Protovis 的实现性能不佳 在这里查看 http www planethunters org classify http www pl
  • 使用样式组件更改 SVG 描边的颜色

    我有一个 SVG 用作 img 标签 使用样式组件 我试图达到在悬停时更改描边颜色的程度 我导入了 SVG import BurgerOpenSvg from images burger open svg 我为它创建了一个样式组件 cons
  • 当 SVG 是编码的 CSS 背景图像时,如何更改 SVG 颜色?

    我的 CSS 文件中编码了一个 SVG 图标 如何在悬停时更改其颜色而不具有不同颜色的重复图标 在我的 CSS 文件中 我有 background image url data image svg xml 3Csvg xmlns http
  • 在 GTK3 中从 Python 中的 SVG 源绘制 SVG 图像

    我可以在 PyQt 中轻松做到这一点 如下所示 img
  • 错误: 属性 d="MNaN,NaNA67.5,67.5 0 1,1 NaN,NaNL0,0Z" 的值无效

    我制作了一个饼图 当所有值都存在时 它工作正常 但是当所有值都设为 0 时 在控制台中我收到 600 多个错误 错误 属性translate translate NaN NaN 的值无效 错误 属性 d M4 133182947122317
  • 如何在 d3.js 中填充 svg 圆圈内的图像

    这是我在 svg 中填充圆圈的代码 var svgContainer d3 select body append svg attr width 1000 attr height 1000 var circles svgContainer s
  • 创建链接到 csv 文件的表

    我正在尝试创建一个链接到的表 csv使用 d3 文件 但我得到的只是一个空白网页 即使以克里米亚为例 我也得到一张空白页 我将很高兴得到指导或展示一个可行的例子或关于我做错了什么的建议 如果您询问如何从 CSV 数据创建 HTML 表 这就

随机推荐

  • 泰坦数据损坏

    我在调用时遇到异常com tinkerpop blueprints Edge getLabel在某些顶点边上 java lang IllegalStateException Could not find type for id 630 at
  • 填充 int 数组从零到定义的数字

    我需要将 C 中的 int 数组从零填充到变量定义的数字 但 ISO C 禁止可变长度数组 如何轻松填充数组 我需要分配 释放内存吗 int possibilities SIZE unsigned int i 0 for i 0 i lt
  • wix 安装程序ice03 无效语言 ID

    我有一个夜间版本 它在与我的不同的机器上运行在我的机器上 我可以毫无问题地编译安装程序并使用 msi然而在晚上构建机器时我得到 C Builds 73 Tools AppInstaller src AppInstaller APPExpor
  • Python - 无限 While 循环

    我不明白为什么底部的 while 循环是无限循环 User enters a positive integer number user input int input Please enter a positive integer numb
  • Swing 中的交互式平面直线图

    我正在尝试在 JApplet 上绘制交互式平面直线图 PSLG 我使用鼠标单击来确定 PSLG 的顶点 这是我用来绘制 PSLG 边缘的算法 1 将用户执行鼠标单击的点添加为 PSLG 的顶点 2 如果他单击第二个点 则该点和先前单击的点之
  • Crockford 风格的上下文着色是否在任何代码编辑器中实现?

    我观看了 YUIConf 2012 的视频 其中 Douglas Crockford 发表了有关在 JavaScript 中实现 monad 的演讲 在本次演讲中 他给出了一个代码示例 该示例利用了他所谓的 上下文着色 它抛弃了按语言语法着
  • 为什么具有 UNC 路径的 .NET 的 File.Open 会进行过多的 SMB 调用?

    我有一段代码需要使用 UNC 路径从 NAS 服务器打开并读取大量小文本文件 此代码是最初用 C 编写的模块的一部分 但现在正在转换为 C C 版本明显慢一些 我确定打开文件的调用几乎是所有性能差异的原因 使用 WireShark 我发现这
  • 在 Linq 查询中比较 byte[]

    我的 SQL 表中有一个二进制列 我使用以下 C 代码成功查询了该表 var hash http www whatever com ToSHA256HashBytes var landingPage context LandingPages
  • 使用 Order By 函数计算两点之间的距离(长、纬度)时 MySQL 查询速度变慢

    我在 MySQL 中有一个查询 它在表的每一行上运行一个存储函数 然后根据函数的结果对行进行排序 然后返回前 10 行 SELECT rowId MyFunction x y constX constY AS funResult FROM
  • 使用 C# 将 UTF-8 转换为 Unicode

    请帮帮我 我在 GET 请求后编码响应字符串时遇到问题 var m refWebClient new WebClient var m refStream m refWebClient OpenRead this m refUri var m
  • Django:使用排除的字段验证 ModelForm 中的 unique_together 约束

    我有一个表格 class CourseStudentForm forms ModelForm class Meta model CourseStudent exclude user 对于具有一些复杂要求的模型 class CourseStu
  • 给定的二叉树是否完整[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 给定一个二叉树 编写一个函数来检查给定的二叉树是否是完全二叉树 完全二叉树是这样的二叉树 除了最后一层之外 每一层都被完全填满 并且所有节
  • NHibernate Criteria 根据另一个表中的 itemid 的分组依据和总和来选择项目

    public class SearchText public virtual int Id get set public virtual string Text get set public class SearchTextLog publ
  • iOS 8+ 远程通知功能始终启用

    仅适用于 iOS gt 8 在我的 AppDelegate 中 我注册用户通知 如下所示 BOOL application UIApplication application didFinishLaunchingWithOptions NS
  • 从动态库调用 fprintf (c++)

    我正在创建一个包含日志记录类的 Windows DLL 库 该类中的日志函数只是像这样调用 fprintf 来进行测试 fprintf stderr 调试 s n 你好 现在 如果我从其他项目 使用该库 中的任何文件中的任何函数使用它 这个
  • 更改字体很棒的图标中的字体大小

    我正在使用 parallax pro genesis 子主题 因此我正在小部件区域内工作 我不确定我是否以正确的方式处理这个问题 但我尝试通过在小部件区域中执行此操作 在很棒的字体图标下进行书写 i class fa fa code fa
  • 当“try .. except IOError”没有捕获FileNotFoundError时如何处理它?

    如何捕获 python 3 上的错误 我用谷歌搜索了很多 但似乎没有一个答案有效 文件 open txt 不存在 因此应该打印 e errno 这就是我现在尝试的 这是我定义的函数 try with open file r as file
  • Python 中的重复排列

    我想迭代一个的所有顶点n尺寸为 1 的维度立方体 我知道我可以做到这一点itertools product如下 gt gt gt n 3 gt gt gt for j in it product 0 1 repeat n print j 0
  • 在钥匙串访问中生成证书签名请求:使用哪个私钥?

    我想知道 Mac OS X Snow Leopard 现在的 Lion 中使用哪个私钥 Keychain Access 每当我使用该应用程序创建 CSR 时 它甚至不要求使用私钥 那么它使用哪一个呢 我可以想象它使用了所选的一个 if您已在
  • 捕获两个重叠元素上的鼠标悬停事件

    所以我有一个 d3 图表rect覆盖以固定十字准线元素mouseover事件 在覆盖层下 我有其他显示数据的矩形mouseover事件处理程序也是如此 但是覆盖层被阻塞mouseover事件在下面的子矩形上形成触发器 let chartWi