SVG 中的单击事件坐标

2023-11-30

该 HTML 包含 SVG:

<div class="container">
  <div class="spacer"></div>
  <svg>
    <g id="polygonGroup" transform="translate(80, 50)">
      <polygon points="-60,-10 -35,-30 -10,-10 -10,30 -60,30"></polygon>
      <polygon points="10,-10 35,-30 60,-10 60,30 10,30"></polygon>
      <polygon class="origin" points="-4,0 0,4 4,0 0,-4"></polygon>
    </g>
    <g id="textGroup" transform="translate(80, 50)">
      <text x="-35" y="10">Text</text>
      <text x="35" y="10">Text</text>
    </g>
  </svg>
</div>

以及这个简单的 jQuery 单击事件处理程序:

function clicked(event) {
    console.log(event.offsetX, event.offsetY);
}

$('svg').click(clicked);

如这里所示:https://jsfiddle.net/1ht0L8y6/6/在不同的浏览器中有不同的行为:

Chrome:无论我在 SVG 内部单击什么位置,坐标都基于 SVG 元素的左上角。这就是我想要的行为。

Firefox:坐标基于我所在的任何元素的左上角,该元素可能是 SVG、多边形或文本。

IE 和 Edge:

  • 当位于 SVG 中但不在其任何子元素中时,坐标 基于 SVG 元素。
  • 当在多边形中时,坐标是 基于的起源<g>集团,以其translate抵消 (即黑钻石)。这样负坐标是可能的, 与 Chrome 或 Firefox 不同。
  • 我观察到不同的行为 这些浏览器中的文本元素:它们会根据以下内容给出坐标 文本元素的底部中间。但我没能做到 在小提琴中重现这一点;在小提琴文本元素中表现 与这些浏览器中的多边形相同。

什么是可靠的跨浏览器方式来获取点击坐标?


我已在您的代码中添加了一个函数来检测 SVG 中的鼠标位置。

let svg = document.querySelector('svg')

function clicked(event) {
  let m = oMousePosSVG(event);
    console.log(m.x,m.y);
}

svg.addEventListener("click", clicked)


function oMousePosSVG(e) {
      var p = svg.createSVGPoint();
      p.x = e.clientX;
      p.y = e.clientY;
      var ctm = svg.getScreenCTM().inverse();
      var p =  p.matrixTransform(ctm);
      return p;
}
svg{border:1px solid}
<div class="container">
  <div class="spacer"></div>
  <svg>
    <g id="polygonGroup" transform="translate(80, 50)">
      <polygon points="-60,-10 -35,-30 -10,-10 -10,30 -60,30"></polygon>
      <polygon points="10,-10 35,-30 60,-10 60,30 10,30"></polygon>
      <polygon class="origin" points="-4,0 0,4 4,0 0,-4"></polygon>
    </g>
    <g id="textGroup" transform="translate(80, 50)" fill="red">
      <text x="-35" y="10">Text</text>
      <text x="35" y="10">Text</text>
    </g>
  </svg>
</div>

要了解有关 SVG 中鼠标检测的更多信息,我推荐这本书:将 SVG 与 CSS3 和 HTML5 结合使用:用于网页设计的矢量图形

我希望它有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVG 中的单击事件坐标 的相关文章

  • 如何获取 CSS 旋转元素的实际(非原始)高度

    我需要获取几个不同元素的实际高度 为了精确的自定义工具提示定位 并且其中一些元素 不是全部 被旋转 elem outerHeight 返回原始高度 而不是实际显示的高度 这是一个非常简单的例子 http jsfiddle net NPC42
  • 错误:导航器只能包含“屏幕”组件作为其直接子组件

    我是 React Native 新手 收到此错误 但无法解决它 我正在遵循主要的教程反应导航页面 https reactnavigation org docs screen options resolution 但我无法完成它 我将不胜感激
  • JavaScript/Angular 1 - Promise.all 到 async-await

    我在两个变量中分配了对 Web 服务的两次调用referencesPromise and contactTypesPromise onInit 如果需要 我可以为此创建一个新方法 onInit const referencesPromise
  • navigator.platform 在 ARM Mac 上的价值是什么?

    苹果有released https www apple com apple events november 2020 几款基于采用 ARM 架构的 M1 芯片的新计算机 与之前基于 x86 架构的计算机相比 的价值是多少navigator
  • ajax 和相对 url

    我真的不明白这个 我有以下 获取 请求 ajax url api getdirectories dataType json success function data Do stuff 这是我的临时服务器向我提供的页面 http atlas
  • 与玻璃钢战斗

    我读过有关 FRP 的内容 非常兴奋 它看起来很棒 因此您可以编写更多高级代码 并且一切都更加可组合 等等 然后我尝试用数百个 sloc 从纯 js 到 Bacon 重写我自己的小游戏 我发现 我实际上不是编写高级纯逻辑代码 而是击败了 B
  • 解密Javascript源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经编写了一段 JavaScrip
  • JavaScript 将 NULL 转换为 0

    我正在使用 jQuery 来获取元素的高度 但如果该元素不存在 以下代码将返回 NULL height menu li active ul height returns integer or null 这是一种跨浏览器安全的方法 可以使用以
  • 需要了解Javascript函数提升示例

    我阅读了 Javascript 提升的概念 它非常令人困惑 但我看到了一些示例并了解了提升的实际作用 所以基本上 提升是 JavaScript 的默认行为 即将所有声明移动到当前作用域的顶部 当前脚本或当前函数的顶部 但我无法理解以下实现
  • 不用AJAX,前台同步拖放文件上传?

    我有一个定期的网站
  • 如何使用 jQuery AJAX 和 JSON 通过 Bootbox 确认表单提交

    我正在使用一个网络应用程序工作Spring MVC 我试图在提交表单之前显示一个确认对话框Bootbox 但我收到 500 内部服务器错误 这是我的表格
  • 已安装 cypress npm 软件包,但缺少 Cypress 二进制文件

    大家好 我是 azure devops CI 的新手 我正在尝试通过在作业之间缓存 node modules 来减少管道构建时间 但我遇到了无法解决的错误 我正在使用 cypress 进行测试 这是我的天蓝色管道 Node js Build
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • JQuery 语言下拉选择器

    我需要一个已经实现的 JQuery 或 JavaScript 下拉语言选择器解决方案 当用户单击下拉菜单时 该下拉菜单应打开 并且应显示语言列表 左侧带有该国家 地区的国旗 我什至找不到例子 任何 jQuery 下拉插件都不能正常工作吗 您
  • JavaScript 不是 DOM 的一部分吗?

    为什么即使从 DOM 中删除用于创建脚本的代码 脚本仍然可以运行 我遇到了一种情况 我想阻止损坏的脚本运行 查看我的帖子 https stackoverflow com questions 2685581 is there a way to
  • 如何在 Mongo 聚合管道的 $unwind 阶段保留零长度值?

    我正在使用聚合管道编写 Mongo 查询 在聚合过程中 我需要 unwind领域之一 但是 我不想要 unwind排除该字段具有零长度数组的条目 因为我仍然需要它们进一步深入管道 我的领域叫做items它是一个对象数组 每个对象包含两个值
  • angular-cli:Karma-Webpack 因“没有此类文件或目录”而失败

    我从Tour of Heroes使用标准 Angular systemjs 现在我正在使用angular client它在开发 生产模式下运行顺利 但我无法测试任何东西ng test 以下内容会被吐出 不仅适用于test ts但也为了pol
  • 获取不正确的日期,将时间戳转换为新日期

    我正在尝试将时间戳转换为日期 但得到的日期不正确 我正在开发一个使用 Angular 和 Typescript 的项目 我有这样的时间戳 1451642400 2016年1月1日 和1454320800 2016年2月1日 如果我编码 da
  • 如何通过 jQuery onblur 提交表单

    所以我尝试通过 jQuery onblur 提交表单 即一旦焦点离开密码字段 表单就会通过 jQuery 提交 有类似的问题 但这不是我要找的 我尝试使用 document getElementById 但它不起作用 任何帮助表示赞赏 提前

随机推荐

  • JS D3 textPath 不显示

    我有下面的代码 想知道为什么不显示文本路径 有人可以帮忙吗 var areas svg append g selectAll path data chord groups enter append path style fill funct
  • 测试 JavaScript 中的“双重”相等性

    我翻译了实验性的 C float 版本快船库到 JavaScript 在最新的沙盒版本中有一个功能几乎等于这似乎很难翻译 由于数值稳定性问题 无法使用 运算符比较双重相等 因此需要此函数来处理这些问题 9223372036854775808
  • Karate BDD中提取带双引号的json数据

    如何从下面的 json 响应负载中提取身份验证令牌以在后续请求中使用 似乎我遇到了麻烦 因为键值中的键有双引号 特征 test oauth背景 网址https xxx yyy com设想 Get xxx subject给定路径xxx oau
  • Android 在 webview 中播放 youtube 视频 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想在 WebView 中播放 YouTube 视频或 当用户单击 YouTube 视频时 我必须将其转发到真正的 YouTube 应用程序 因为在 WebView 中我无法播放
  • 用于 CGM(计算机图形图元文件)格式的 .NET 或 C# 库?

    有谁知道用于在 WinForms 和 Microsoft Service Reports CrystalReports 中显示 CGM 文件以便也可以打印的 NET C 库 如果它还能够将文件转换为网络友好的图形格式 如 jpeg gif
  • C# 合并运算符

    为什么下面的代码返回 false public static void Main bool someCondition true bool someConditionOverride false bool result someCondit
  • 在 Android 上将 UTC 转换为本地时间

    在我的项目中 我获得了 json 格式的 API 响应 我得到一个 UTC 时间格式的时间字符串值 如下所示Jul 16 2013 12 08 59 AM 我需要将其更改为当地时间 这就是我们使用此应用程序时需要显示当地时间的地方 我该如何
  • 如何确保修改 .h 文件时,包含该文件的 .cc 文件会在使用 Visual Studio 2008 的发布版本中自动编译?

    假设我的 Visual Studio 2008 项目中有 a h a cc 和 b cc a cc 和 b cc 都包含 a h 当我修改 a h 并构建项目时 a cc 和 b cc 在调试版本中进行编译 然而 在发布版本中情况并非如此
  • 虚函数效率和“final”关键字

    考虑一个有类的程序Foo包含一个函数Foo fn声明如下 virtual void fn 和一个子类Foo called Bar 将会声明Bar fn像这样 virtual void fn override final 导致呼叫fn in
  • 找不到导入tuneup.js文件

    使用 Xcode iOS Instruments UI Automationtunup js javascript 库https github com alexvollmer tuneup js 我在理解我启动的仪器的当前工作目录方面遇到了
  • 更新自定义字段结束于无限循环

    我在 AR 发票和备忘录 屏幕 ID AR301000 中有一个对应 AP 参考的自定义字段 Nbr 在类似的管理器中 AP 账单和调整 屏幕 ID AP301000 中的另一个自定义字段对应于相应的 AR 参考 Nbr 我正在尝试更新 A
  • 如何在 C# 中从数据库检索时将 varBinary 转换为图像或视频

    我正在使用 Visual Studio 2010 桌面应用程序 并使用 LINQ to SQL 将图像 视频或音频文件保存到 dataType 中的数据库VarBinary MAX 我可以做到这一点 问题是 我无法获取它们并在 xaml 中
  • 使用VBS下载文件

    我有一个 VBS 脚本 可以生成一个 URL 以从网络上的服务器下载文件 我现在需要将文件下载到 C rWallpaper wallpaper png URL 存储在变量中 url 我希望它能像 Linux 上的 wget 一样工作 只需下
  • JVM的LookupSwitch和TableSwitch有什么区别?

    我很难理解 Java 字节码中的 LookUpSwitch 和 TableSwitch 如果我理解得好的话 LookUpSwitch 和 TableSwitch 都对应于switchJava 源代码声明 为什么一条 JAVA 语句会生成 2
  • 为什么这里没有生成 Coredump 文件?

    我这里遇到一种情况 几天前我能够在目标板上看到核心转储文件 我通过在 etc profile 中添加 ulimit c unlimited 来启用核心转储生成 但后来有人告诉我 这会only对从登录 shell 启动的程序有效 对由以下命令
  • Hibernate 拦截器 - 加载事件之后

    实体加载后是否发生任何事件 我的目标是将这个实体添加到 Solr 或 Lucene 索引中 EmptyInterceptor OnLoad 事件发生在对象初始化之前 我想在设置对象属性后处理事件 是否可以使用 Hibernate 拦截器或其
  • Java - 使用 catch 块内的方法返回语句并引发异常?

    我有以下代码 使用 hibernate 在错误时引发自定义异常 并且我还想在这种情况下关闭会话 因为除非在客户端计算机上接收到 否则不会捕获异常 public
  • 如何将 Google 表格文件转换为 Excel 文件 (XLSX)

    The image shows the code who is updated var xlsFile 未定义 为什么 如何使用 Google Sheets 脚本编辑器将 Google Sheets 文件转换为 Excel 文件 funct
  • 无效签名错误!

    我正在尝试更新我的应用程序 但上传二进制文件后 Itunes connect 向我发送了以下电子邮件 尊敬的开发者 感谢您的 最近提交的 我的应用程序 的二进制文件 到应用商店 不幸的是我们 发现您的二进制文件存在问题 您需要按顺序更正 以
  • SVG 中的单击事件坐标

    该 HTML 包含 SVG div class container div class spacer div div