在 SVG 中编写 数据脚本(读取和修改)

2024-01-01

我一直在寻找为我的 SVG 运行脚本的方法。 但我得到的所有东西都不匹配!而且它没有包含足够的信息说明为什么使用每组代码。例如,一个使用event.target,另一个有event.getTarget(),另一个有event.target.firstchild.data.

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <path d="M150 0 L75 200 L225 200 Z" />
</svg>

这是路径 svg 的示例,对吗?我需要的是获取这些坐标,可能将其放入变量中,并将其用作另一个 svg 的坐标。那么我该怎么做呢?另一件事是如何通过在界面中输入数字来更改这些坐标?


听起来您可能有四个问题:

  1. 如何将脚本嵌入 SVG 文件中?
  2. 如何在 SVG 文件中运行脚本?
  3. 我如何访问数据<path>脚本中的元素?
  4. 我如何操作数据<path>脚本中的元素?

让我们一次解决一个问题:


如何将脚本嵌入 SVG 文件中?

如中所述SVG 规范 http://www.w3.org/TR/SVG/script.html#ScriptElement你可以放置一个<script>文档中包含 JavaScript 代码的元素。根据最新的SVG规范,你不需要指定type属性 http://www.w3.org/TR/SVG/script.html#ScriptElementTypeAttribute为你的脚本。它将默认为type="application/ecmascript".

  • 其他常见的哑剧类型包括"text/javascript", "text/ecmascript"(在 SVG 1.1 中指定),"application/javascript", and "application/x-javascript"。我没有有关所有这些浏览器支持的详细信息,或者省略了type属性一并。我一直都取得了很好的成功text/javascript.

与 HTML 一样,您可以将脚本代码直接放入文档中,也可以引用外部文件。当执行后者时,您必须使用href属性(不src) 对于 URI,属性位于xlink命名空间。

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <script xlink:href="/js/mycode.js" />
  <script><![CDATA[
    // Wrap the script in CDATA since SVG is XML and you want to be able to write
    // for (var i=0; i<10; ++i )
    // instead of having to write
    // for (var i=0; i&lt;10; ++i )
  ]]></script>
</svg>

如何在 SVG 文件中运行脚本?

与 HTML 一样,SVG 文档中包含的代码一遇到就会运行。如果您将您的<script>元素位于文档其余部分之上(就像您将<script> in the <head>HTML 文档),那么当您的代码运行时,您的文档元素将不可用。

避免这种情况的最简单方法是将您的<script>文档底部的元素:

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <!-- all SVG content here, above the script -->
  <script><![CDATA[
    // Now I can access the full DOM of my document
  ]]></script>
</svg>

或者,您可以在文档顶部创建一个回调函数,仅当文档的其余部分准备就绪时才调用该函数:

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
  <title>SVG Coordinates for Embedded XHTML Elements</title>
  <script>document.documentElement.addEventListener('load',function(){
    // This code runs once the 'onload' event fires on the root SVG element
    console.log( document.getElementById('foo') );
  },false)</script>
  <path id="foo" d="M0 0" />
</svg>

我如何访问数据<path>脚本中的元素?

有两种方法可以访问有关 SVG 中元素的大部分信息:您可以通过标准 DOM Level 1 Core 方法以字符串形式访问属性getAttribute() http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-getAttribute,或者您可以使用SVG DOM 对象和方法 http://www.w3.org/TR/SVG/svgdom.html。让我们看看两者:

通过以下方式访问路径数据getAttribute()

Using getAttribute()返回与查看源代码时看到的相同的字符串:

<path id="foo" d="M150 0 L75 200 L225 200 Z" />
<script><![CDATA[
  var path = document.getElementById('foo');
  var data = path.getAttribute('d');
  console.log(data);
  //-> "M150 0 L75 200 L225 200 Z"
]]></script>
  • 优点:调用非常简单;你不必了解任何有关 SVG DOM 的知识
  • 缺点:既然你返回一个字符串,你必须自己解析该属性;对于 SVG<path>数据,这可能会令人痛苦。

通过 SVG DOM 方法访问路径数据

<path id="foo" d="M150 0 L75 200 L225 200 Z" />
<script><![CDATA[
  var path = document.getElementById('foo');

  // http://www.w3.org/TR/SVG/paths.html#__svg__SVGAnimatedPathData__normalizedPathSegList
  // See also path.pathSegList and path.animatedPathSegList and path.animatedNormalizedPathSegList
  var segments = path.normalizedPathSegList ;

  for (var i=0,len=segments.numberOfItems;i<len;++i){
    var pathSeg = segments.getItem(i);
    // http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSeg
    switch(pathSeg.pathSegType){
      case SVGPathSeg.PATHSEG_MOVETO_ABS:
        // http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSegMovetoAbs
        console.log("Move to",pathSeg.x,pathSeg.y);
      break;
      case SVGPathSeg.PATHSEG_LINETO_ABS:
        // http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSegLinetoAbs
        console.log("Line to",pathSeg.x,pathSeg.y);
      break;
      case SVGPathSeg.PATHSEG_CLOSEPATH:
        // http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSegClosePath
        console.log("Close Path");
      break;
    }
  }
]]></script>

上述脚本产生以下输出:

Move to 150 0
Line to 75 200
Line to 225 200
Close Path
  • 优点:路径数据已为您解析;您可以从 API 本身获得准确的数字;使用normalizedPathSegList接受相对命令并使它们对你来说是绝对的;如果 SMIL 动画正在更改路径数据,则使用非动画 pathSegList 可以让您访问无法通过以下方式获得的基本非动画信息getAttribute().

  • 缺点:甜蜜的黑猩猩着火了,看看那段代码!这甚至不能处理所有可能的可用路径段。

因为阅读 SVG DOM 的 W3C 规范可能很困难,所以很多年前我创建了一个在线工具来浏览存在的属性和对象。您可以在这里使用它:http://objjob.phrogz.net/svg/hierarchy http://objjob.phrogz.net/svg/hierarchy


我如何操作数据<path>脚本中的元素

与上面类似,您可以创建一个新字符串并使用setAttribute()将其推到对象上,或者您可以操作 SVG DOM。

使用操作路径数据setAttribute()

<path id="foo" d="M150 0 L75 200 L225 200 Z" />
<script><![CDATA[
  var path = document.getElementById('foo');
  path.setAttribute('d','M150,0 L150,100 200,300 Z');
]]></script>

使用 SVG DOM 操作路径数据

<path id="foo" d="M150,0 L75,200 l150,0 Z" />
<script><![CDATA[
  var path = document.getElementById('foo');
  var segments = path.pathSegList;
  segments.getItem(2).y = -10;
]]></script>

一般来说,只需要修改各个属性即可SVGPathSeg子类实例;更改会立即在 DOM 中进行。 (在上面的示例中,随着最后一个点稍微向上移动,原始三角形发生了倾斜。)

当你需要创建新的路径段时,你需要使用类似的方法var newSegment = myPath.createSVGPathSegArcAbs(100,200,10,10,Math.PI/2,true,false) http://www.w3.org/TR/SVG/paths.html#__svg__SVGPathElement__createSVGPathSegArcAbs然后使用其中一种方法将此段粘贴到列表中,例如segments.appendItem(newSegment) http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSegList.

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

在 SVG 中编写 数据脚本(读取和修改) 的相关文章

  • 当内部元素滚动位置到达顶部/底部时防止父元素滚动?

    我有一个小 浮动工具箱 一个带有position fixed overflow auto 效果很好 但是 当在该框内滚动 使用鼠标滚轮 并到达底部或顶部时 父元素 接管 滚动请求 工具框后面的文档滚动 这很烦人 而不是用户 要求的 我正在使
  • 将 Regex 对象分配给 html 输入模式

    我需要以编程方式将正则表达式对象分配给输入元素模式属性 以下是我当前的实现 var regex d 5 element attr pattern regex toString slice 1 1 有没有更好的方法来做到这一点而不需要字符串操
  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • 裁剪 SVG 的正确方法?

    我对 SVG 图像完全感到困惑 我想将图像裁剪为其核心内容 我想通过指定其视图框和 或视口和 或其他任何内容来裁剪它 除非我不想更改折线元素中的任何点 图像按原样呈现类似这样的内容 注意 边框仅用于说明目的 边框实际上并不是 SVG 的一部
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • .points 不透明度/大小在三个.js 内

    我回来回答有关 points 的第二个问题 这次想知道如何将不透明度从 0 更改为 1 然后又回到距发射器的特定像素距离内 var particleCount 14 particles new THREE Geometry pMateria
  • 使用 float:left 与 display:inline-block 的 jQuery UI 拖放排序比较

    我这里有两个例子 这两个例子之间的唯一区别是 一种使用display inline block 另一种使用float left li doc item 显示 内联块 与 li doc item float left 我的问题是 displa
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 如何在React中动态分配属性?

    这是一个有两个参数的函数 我要创建的标签的名称 具有以下属性的对象 Using React 我创建一个组件并将该元素渲染到 DOM 问题是我想向元素添加属性 但它不允许循环在元素内设置属性 var Element function elem
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • 如何解决“消息端口在收到响应之前已关闭”的问题。在 JavaScript 中的 window.location.reload() 之后

    我遇到了 javascript 问题 从 chrome v73 0 3683 86 开始 每当我在 window location reload 函数之后运行 javascript 代码时 它总是给我错误 Unchecked runtime
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作
  • 将 html 文本框的值分配给 div 的标题

    line 1
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

  • Xcode 无法编译为模拟器

    我刚刚通过 App Store 更新了 Xcode 4 5 这是我从 Apple 开发者帐户获得的先前版本 自更新以来 我无法将任何应用程序编译到模拟器中 我可以编译到设备上 例如我的iPhone 我收到的错误是 fatal error f
  • Flutter导航push()和pop(),填满堆栈?

    在 Flutter 中构建一个应用程序 我想使用导航抽屉并添加了一些 FlatButton 每一个FlatButton has an onPressed 我所做的方法Navigator push 移动到所需的页面 该页面工作得很好 我想知道
  • 在控制台上显示“更新文本”

    有没有办法在 python 中创建进度条或更新命令行百分比之类的东西 每次更新都比新行更可取 something that looks like this for n in range 10 print n 10 打印 r字符 回车 会将光
  • Java:仅从集合中选择提供类型的元素

    我有一个 B 类型和 C 类型元素的集合 它们都扩展了 A 我需要过滤该集合以仅获取 B 类型的元素 除了以下方法之外 还有什么办法可以做到这一点吗 for A a initCollection if a instanceof B newC
  • 从模型验证中排除字段

    假设我有一个追随者ViewModel public class PersonViewModel Required public String Email get set Required public String FirstName ge
  • 如何在Android中设置导航控制器?

    我正在使用以下活动布局fragment and a BottomNavigationView
  • 如何使用 JavaScript 转义包含换行符的 JSON 字符串?

    我必须形成一个 JSON 字符串 其中的值具有换行符 必须对其进行转义 然后使用 AJAX 调用进行发布 任何人都可以建议一种使用 JavaScript 转义字符串的方法吗 我没有使用 jQuery 获取您的 JSON 并 stringif
  • 如何从Python脚本代码可靠地检查刚刚创建的目录是否存在?

    当我在不存在的系统上运行以下代码时 AnewDir代码退出后 系统上会出现一个新目录 from subprocess import Popen PIPE from os path import isdir from time import
  • @[] 在 Objective C 中有什么用[重复]

    这个问题在这里已经有答案了 我见过 NSArray objectsToShare objects 当查看一些示例代码时 是什么意思 objects here NSArray objectsToShare objects 是相同的 NSArr
  • 如何在 Twitter 上搜索关键字

    我正在尝试构建一项服务 在持续监控的基础上为 Twitter 中的多个用户执行关键字搜索 似乎有 5 种不同的方法可以实现这一目标 但都有各自的缺点 我浏览了 Twitter 和 twitter4j 文档 找不到任何其他方法 使用 Twit
  • 如何通过具有多个字段的查询创建动态订单

    我正在尝试创建一个具有多个 order by 字段的存储过程 按字段和方向的顺序作为参数通过存储过程传递 CREATE PROCEDURE GetFilteredLogs FromDate datetime2 ToDate datetime
  • 将 NSURL ** 转换为 CFURLRef *

    如何使用 ARC 编译以下代码 int main NSURL url NSURL new NSURL strong urlPointer url CFURLRef cfPointer bridge CFURLRef urlPointer g
  • Chrome 中的 CSS 渲染在线与离线不同

    我在使用 Google Chrome 时遇到了最奇怪的问题 当我从文件本地预览时 我的 html css 布局在所有浏览器中看起来都很棒 但是当我上传它时 Chrome 并且只有 Chrome 破坏了它 所有其他浏览器都表现良好 甚至 Sa
  • 删除Python用户警告

    我刚刚安装完我的MySQLdbPython 2 6 的包 现在当我使用以下命令导入它时import MySQLdb 将会出现用户警告 usr lib python2 6 site packages setuptools 0 8 py2 6
  • JPA/Hibernate 嵌入式 id

    我想做这样的事情 ReportingFile 对象 可以是 LogRequest 或 LogReport 文件 两者具有相同的结构 一个报告对象 包含一个 logRequest 带有日期的 logReport 列表 我尝试设置一个 Embe
  • 为什么 null React 组件状态初始化会得到“never”类型?

    当将组件的状态初始化为null在组件构造函数之外 状态的类型为never在渲染函数中 但是 当在构造函数中初始化状态时 状态具有正确的类型 根据 StackOverflow 上关于初始化状态的两种方法 在 babeled JS 中 的大多数
  • 在散景中使用 TapTool 设置图形范围

    在下面的示例中 我有两个相互重叠的散点图 预期的行为是 单击上图中的一点时 下图中的点会放大到周围区域 单击下图中的某个点时 下图会放大到周围区域 我已经运行了第一个行为 但第二个行为似乎不起作用 x range重置以覆盖数据的整个范围 忽
  • 仅保证 std::min/std::max 进行一次评估

    C 标准是否保证调用 c std min f x g x 只计算函数 f 和 g 一次 是的 由于 std min 是一个函数 因此 f x 和 g x 将仅计算一次 并且返回值不会被复制 查看函数原型 template
  • Windows 上的 Perl:编码问题

    我的 Perl 脚本有问题 在类 UNIX 系统中 它会打印出所有 Unicode 字符 例如 正确地连接到控制台 在 Windows 命令行中 字符被分解为无意义的字形 有没有一种简单的方法可以避免这种情况 我在用着use utf8 提前
  • 在 SVG 中编写 数据脚本(读取和修改)

    我一直在寻找为我的 SVG 运行脚本的方法 但我得到的所有东西都不匹配 而且它没有包含足够的信息说明为什么使用每组代码 例如 一个使用event target 另一个有event getTarget 另一个有event target fir