Firefox 中的 svg innerHTML 无法显示

Posted

技术标签:

【中文标题】Firefox 中的 svg innerHTML 无法显示【英文标题】:svg innerHTML in firefox can not display 【发布时间】:2014-05-25 01:25:26 【问题描述】:

我使用 innerhtml 添加 svg 元素,它在 chrome 中运行良好,但在 firefox 中无法显示;非常感谢您的任何回答

    <!DOCTYPE html>
    <html>
    <head>
        <title>SVGInnerHTML demo</title>
        <meta charset="utf-8" />
        <script src="svginnerhtml.js"></script>
        <script>
        alter  = function () 
            var svg = document.getElementById('container');

            svg.innerHTML   = '<rect   fill="green" />'
                            + '<circle cx="10" cy="19" r="20" fill="blue"></circle>'
                            + '<text x="15" y="20" fill="white">hello world</text>'
                            + '<g transform="translate(0, 70)"><rect   fill="yellow" /></g>';
        
        </script>
    </head>

    <body>

    <svg id="container"   http://www.w3.org/2000/svg>

    </svg>

    <p>
    <button onclick="alter()">set .innerHTML</button>
    <button onclick="alert(document.getElementById('container').innerHTML)">get .innerHTML</button>
    </p>
    </body>
    </html>

【问题讨论】:

从 Firefox 36 开始,这应该可以正常工作。 【参考方案1】:

一种解决方法是将 innerHTML 代码添加为 HTML,而不是 SVG。您只需在 HTML 代码中使用 &lt;div&gt;(而不是 &lt;svg&gt;)作为占位符,然后通过 innerHTML 插入完整的 SVG。

替换:

<svg id="container"  >
</svg>

<div id="container" style="width: 100px; height: 100px">
</div>

并将您的 innerHTML 字符串包装在 &lt;svg&gt; 元素中:

var svg = document.getElementById('container');
svg.innerHTML   = '<svg><rect   fill="green" />'
                + '<circle cx="10" cy="19" r="20" fill="blue"></circle>'
                + '<text x="15" y="20" fill="white">hello world</text>'
                + '<g transform="translate(0, 70)">'
                + '<rect   fill="yellow" /></g></svg>';

这应该适用于 Chrome 和 Firefox。这是JSFiddle

【讨论】:

如你所说;我将我的代码更改为var tempDiv = document.createElement("div"); tempDiv.innerHTML = "&lt;svg&gt;"+svgEles+"&lt;/svg&gt;" var svgNodes = Array.prototype.slice.call(tempDiv.childNodes[0].childNodes); svgNodes.forEach(function(el) container.appendChild(el); ); 这个工作在 chrome 和 firefox 中;并且很容易修复我的旧代码谢谢!

以上是关于Firefox 中的 svg innerHTML 无法显示的主要内容,如果未能解决你的问题,请参考以下文章

Flutter web:Firefox 中的 SVG

Firefox 中的 SVG 过滤器转换

Firefox中的svg变换原点问题

组件属性未在 innerHTML html 中呈现

Firefox 浏览器中的 SVG 路径元素缩放转换错误

内容安全策略正在阻止 Firefox 中的 svg 图标精灵