如何将 svg 对象(使用 DOMParser 从字符串创建)添加到 div 元素中?

Joh*_*ohn 3 javascript firefox svg standards-compliance innerhtml

我这里运行的是 Firefox 41。

我有一个完整的 svg 文件代码,是从维基媒体的公共资源中随机获取的。(https://upload.wikimedia.org/wikipedia/commons/c/c6/%2212_World_fly.svg

然后我尝试了以下两个版本将其推入 div 元素,一次使用 div 的innerHTML,一次尝试 div 的appendChild。

innerHTML 至少可以工作,尽管用 webdeveloper 查看生成的 html 看起来有点可疑

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.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">
Run Code Online (Sandbox Code Playgroud)

也出现了。

使用appendChild根本不起作用。

我想使用诸如appendChild之类的东西,因为我知道使用innerHTML的解析器时可能存在陷阱。

那么,如何将 svg 文件的完整字符串获取到 div 中呢?

<html>
<head>
  <script type="application/javascript">
 function dgebi(id) {
    return document.getElementById(id);
}
// short svg file as string
var svgtext = ... //... here I added the string from https://upload.wikimedia.org/wikipedia/commons/c/c6/%2212_World_fly.svg
var d;
function init() {
    d = dgebi('id:testdiv');
    //useInnerHTMLToCreateSVG();
    useDOMParser();
}
function useInnerHTMLToCreateSVG() {
    d.innerHTML = svgtext;
}
function useDOMParser() {
// see https://developer.mozilla.org/de/docs/Web/API/DOMParser#Parsing_an_SVG_or_HTML_document
    var parser = new DOMParser();
    var doc = parser.parseFromString(svgtext, "image/svg+xml");
    // returns a SVGDocument, which also is a Document.
    d.appendChild(doc);
}    
function createElementSVG() {
    var se = document.createElement('SVG');
    d.appendChild(se);
    console.log(se);
}
</script>
</head>
<body onload="init();">
<div style="width:400px;height:400px;border: 1px #ff0000 solid;" id="id:testdiv"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Rob*_*son 5

您需要附加一个元素而不是文档,即

d.appendChild(document.adoptNode(doc.documentElement));
Run Code Online (Sandbox Code Playgroud)

在实践中,您可以省略领养节点。尽管它是 w3c 强制要求的(并且被 the8472 指出是严格正确的),但仍有太多损坏的站点供浏览器强制使用它。

此外,您无法使用 createElement 创建 SVG 元素(这只会创建 HTML 元素)。您需要使用 createElementNS 即

var se = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
Run Code Online (Sandbox Code Playgroud)

请注意小写名称,因为 SVG 区分大小写。

  • 将元素从一个文档传输到另一个文档实际上应该首先使用 [document.adoptNode](https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptNode)。大多数浏览器可能对此比较宽容,但并非所有浏览器都是如此。 (2认同)