(嵌入并)通过 D3 和/或 javascript 引用外部 SVG

2023-12-24

我有一个 .svg 文件,想将其嵌入到我的 d3 图形的 svg 结构中。

我还需要通过某些 g 元素的 id 引用附加到 g 元素的所有路径/多边形。

我尝试了不同的方法来嵌入和引用 svg (g's),但由于某些原因它不起作用:

(1)第一次尝试

// Firefox displays my svg but when i open it with Chrome the svg     
//is not displayed (just default placeholder icon)
// I can't reference the svg-g id's with d3.select functions. 
main_chart_svg
        .append("svg:image")
        .attr("xlink:href", "mySVGpicture.svg")
        .attr("x", "50")
        .attr("y", "50")
        .attr("width", "500")
        .attr("height", "500");  

main_chart_svg.select("#anIdWhichIsInTheSvgFile").remove(); //// This doesn't work

(2)第二次尝试

// This displays the svg but -not- inside my main-chart-svg. I want to keep the graphic   
//things seperate to html-stuff.
d3.xml("mySVGpicture.svg", "image/svg+xml", function(xml) {
        document.body.appendChild(xml.documentElement);
    });
//----------or----------//
    d3.select("body")
        .append("object")
        .attr("data", "mySVGpicture.svg")
        .attr("width", 500)
        .attr("height", 500)
        .attr("type", "image/svg+xml");

d3.select("#anIdThatIsInTheSvgFile").remove(); //does not work.

(3) svg 文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="400px"
     height="400px" viewBox="0 0 400 400" enable-background="new 0 0 400 400" xml:space="preserve">
    <g id="anIdWhichIsInTheSvgFile">
        <g id="DE">
            <path fill="#FEDCBD" d="M215.958,160.554c0,0-0.082, ... ,1.145
                l0.865,0.656L215.958,160.554z"/>
            <path fill="#FEDCBD" d="M208.682,155.88l1.246,1.031c0,0,0.191,0.283, ... ,0.572L208.682,155.88z"/>
            <polygon fill="#FEDCBD" points="190.76,153.007 190.678, ... ,153.938 
                191.427,152.906"/>
            <polygon fill="#FEDCBD" points="170.088,151.015 169.888,150.067 169.125,150.075 168.846,150.836 169.521,151.588"/>
            <polygon fill="#FEDCBD" points="168.953,152.067 168.188,151.505 168.674,152.639"/>
            <polygon fill="#FEDCBD" points="170.105,153.099 170.666,152.052 170.002,152.248"/>
    </g>
    <g id="anIdThatIsInTheSvgFile">
    ...
    </g>
</svg>

有更好的解决方案。

我没有意识到d3.xml() https://github.com/mbostock/d3/wiki/Requests#wiki-d3_xml函数返回读入的 xml 文件作为文档片段 https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment(而不是将其转换为 JSON)。换句话说,它返回一个现成的 DOM 树,可以将其插入主文档的 DOM 中任何需要的地方。

知道这一点(并且知道独立的 SVG 文件也是 XML 文件),这可能是将外部 SVG 内容添加到网页的最可靠方法:

d3.xml("http://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", 
        function(error, documentFragment) {

    if (error) {console.log(error); return;}

    var svgNode = documentFragment
                .getElementsByTagName("svg")[0];
    //use plain Javascript to extract the node

    main_chart_svg.node().appendChild(svgNode);
    //d3's selection.node() returns the DOM node, so we
    //can use plain Javascript to append content

    var innerSVG = main_chart_svg.select("svg");

    innerSVG.transition().duration(1000).delay(1000)
          .select("circle")
          .attr("r", 100);

});

在这里小提琴:http://jsfiddle.net/J8sp3/4/ http://jsfiddle.net/J8sp3/4/

请特别注意,(a) 我将内容添加到现有 SVG,并且 (b) 我不会删除该 SVG 的任何当前内容。

当然,您也可以将 SVG 添加到<div>或任何其他可以包含它的元素:http://jsfiddle.net/J8sp3/3/ http://jsfiddle.net/J8sp3/3/

此方法应该适用于任何支持 SVG 的浏览器。我什至在IE8中尝试过,即使IE8不知道如何绘制圆形和矩形,DOM结构也是正确的!

@Seb,请取消选择上一个答案,然后选择此答案作为接受的答案。

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

(嵌入并)通过 D3 和/或 javascript 引用外部 SVG 的相关文章

随机推荐

  • Z3中的parthood定义

    我试图在 Z3 中定义集合对 使用数组定义 之间的部分关系 在下面的代码中称为 C 我写了 3 个断言来定义自反性 传递性和反对称性 但 Z3 返回 未知 我不明白为什么 define sort Set Array Int Bool dec
  • 使用模板时出现 g++ 重复符号错误(菜鸟问题)

    因此 我尝试选择 C 为此我决定使用模板编写一个通用 Group 类 该类采用类型和大小作为模板参数 在group h中 ifndef GROUP H define GROUP H define MAX SIZE 10 Define a G
  • ReflectionException:类不存在

    当我尝试运行作曲家时遇到此错误 name zepluf standard edition description The ZePLUF Standard Edition distribution autoload psr 0 src req
  • 检测对象是否已覆盖 toString() [重复]

    这个问题在这里已经有答案了 我收到一个对象并需要记录它 其中一些有习惯toString 然后我想用它 但有些没有 我得到类似的东西mightypork rogue bus events MouseMotionEvent 2d19587d 我
  • 在 Android 手机上每 66 毫秒拍照一次以进行颜色分析(心率监视器)

    我正在做一个大学最后一年的项目 其中涉及为 Android 制作一个医疗应用程序 作为练习 我必须制作一个心率监测器应用程序 我发现最好的方法是在打开闪光灯的情况下将相机放在手指上 观察血液中颜色的变化 这就是问题出现的地方 是否可以用相机
  • 为什么使用 conda 安装 rstudio,r 版本 4,在我的 Linux 系统上使用 conda 会返回有关不兼容规格的错误?

    我正在尝试使用 condas 安装 r 和 rstudio conda create c conda forge n r4rs r base 4 0 rstudio gt Collecting package metadata curren
  • MySQL数据库存储产品、颜色、尺寸和库存

    我有一个处理衬衫商店的购物车的任务 并且对存储衬衫属性 例如每个商品的颜色 尺寸和库存 的数据库设计感到困惑 假设将以下衬衫存储到数据库 Product name Nike shirt Available colors black whit
  • 如何在python中不断增加值的同时获取输入?

    我对 Python 还很陌生 我正在尝试用 python 制作一个基于文本的类似策略的游戏 我希望有一个不断增加的值 我也希望有一些其他值同时增加或减少 但这只是为了开始 但如果我使用While True循环我不能在程序中做任何其他事情 它
  • 聚合 numpy 函数

    我有一个密集调用的 numpy 操作 我需要优化 np sum a 2 axis 1 5 where a is a 2 dimensional ndarray 该操作由三个函数组成 需要迭代 a 三次 将所有操作聚合在一个函数下并沿轴 1
  • 在 Zeppelin 0.7.1 中运行 Spark 代码时出现 NullPointerException

    我已经安装了Zeppelin 0 7 1 当我尝试执行示例 Spark 程序 可通过Zeppelin Tutorial笔记本 我收到以下错误 java lang NullPointerException at org apache zepp
  • 如何在执行junit时自动生成时序图

    我在 Eclipse 中接到了 在执行 junit 测试用例时自动生成序列图 的任务 我正在学习UML 我找到了可以生成序列的工具 并且我知道 junit 但是我如何将这两者结合起来 我发现不错的工具有 UMLet ModelGoon UM
  • 使用 HOGDescriptor 的问题

    我正在摆弄一些c opencv 我正在查看一些样本 但还没有 设法编译 运行 peopleDetect cpp 它使用HOGDescriptor 我已经设置了一个基本的 Qt 控制台应用程序来测试和缩小问题范围 并得到了这个基本代码 inc
  • 类 static constexpr 的 C++ 链接器错误

    我正在编译以下简单程序g 4 6 1 std c 0x include
  • 在 ControlParameter 中找不到控件 ID

    我试图从文本框中插入值 但收到错误消息 无法在控制参数中找到 controlid TextBox 位于表单视图内 而表单视图位于列表视图内 SqlDataSource 位于 ListView 之外 我的 InsertButton Click
  • 使用 scipy 和 sympy 进行 Python 集成

    我想要一个自定义的 python 函数 采用数学表达式f x 积分的界限x1 x2和所需的耐受性tol Uses sympy integrate y x 检查它是否有解析 符号解 如果有则使用返回结果sympy integrate y x
  • 如何使用 Flutter 在 android studio 中进行代码折叠区域块

    我可以像这样在 android studio 中做区域块 region Description Your code here endregion 但如何与 flutter 一样呢 在 IntelliJ 或 Android Studio ID
  • 注入到 Vue.js 中的

    我有一些外部脚本需要加载到各个页面上 例如 Google Places Autocomplete Facebook API 等 显然 在每条路线上加载它们是没有意义的 但是文档没有解决这种相当常见的情况 此外 Vue 实例安装到主体内的标签
  • 导入多个 AngularJS 模块的工厂

    我想知道是否有一种方法可以将我在 AngularJS 模块中定义的所有工厂导入到控制器中 而不必将它们全部列出 假设我有一个名为foo js包含 angular module Foo factory Bar1 function factor
  • 如何将字符串转换为数组的名称?

    我有大量包含不同数据的数组 每个都有一个看起来像这样的名字 rsf wings isa wings isa ships isa civs etc 我有一个函数可以构建一个String arrayName从传递给它的各种组件中 public
  • (嵌入并)通过 D3 和/或 javascript 引用外部 SVG

    我有一个 svg 文件 想将其嵌入到我的 d3 图形的 svg 结构中 我还需要通过某些 g 元素的 id 引用附加到 g 元素的所有路径 多边形 我尝试了不同的方法来嵌入和引用 svg g s 但由于某些原因它不起作用 1 第一次尝试 F