获取 svg-tag 的 innerHTML 结果在 IE 中未定义

Get innerHTML of svg-tag result in undefined in IE

我在 Internet Explorer 中使用 javascript 获取 svg 标签的 html 内容时遇到一些问题。

我的javascript代码如下:

console.log($('.icon')[0].innerHTML);

我的 html 文档中的标签:

<svg class="icon"><use>testing</use></svg>

这在 Chrome、Firefox 和我们拥有的产品中运行良好,但在 Internet Explorer 中我留下了一个未定义的错误。是我的 Javascript 和 jQuery 的混合吗?

为什么我似乎无法获取我的 svg-tag 的内容?我尝试了一些不同的东西,但经常以 "SCRIPT5007: Unable to set property 'innerHTML' of undefined or null reference"

结束

帮帮我 :) 谢谢!

Internet Explorer 当前不支持 SVG 元素上的 innerHTML 方法。但是,我们确实在内部打开了一个问题来跟踪我们对该功能的考虑。与此同时,我会探索替代解决方案,例如据称在 Internet Explorer 9 和更新版本中有效的 InnerSVG polyfill

最终我找到了某种解决方案。也许是一种骇人听闻的方式?但至少对我有用。

而不是获取我在 IE 中无法获取的原始 innerhtml。我尝试通过这样做让我的 svg-tag 中的每个元素节点:

var element = document.getElementsByTagName('svg')[0].childNodes;
for (i = 0; i < element.length; i++) {
    if (element[i].nodeName != '#text') {
        console.log(element[i]);
    }
}

使用 XMLSerializer 怎么样?以某种方式获取元素,然后执行此操作...

console.log(new XMLSerializer().serializeToString(element));

console.log($('.icon').parent().html()); 在 IE11 中对我来说很好用。

传递的字符串以 XML 声明开头 <?xml version="1.0" encoding="iso-8859-1" ?> 这似乎是作为 svg 节点的父节点处理的。

以下代码将为您提供来自给定 SVG 的字符串形式的内容。 它基于 .

const svgNode = document.getElementsByTagName('svg')[0];
const serializer = new XMLSerializer();

const svgContent = Array.prototype.map.call(
  svgNode.childNodes, 
  (child) => serializer.serializeToString(child)
).join('');
(function () {
    var svg = document.createElementNS("http://www.w3.org/2000/svg","svg");
    if(typeof svg["innerHTML"] !== "undefined") {
        return;
    }

    var node = $('<script type="text/svg_template"></script>');

    Object.defineProperty(SVGElement.prototype, 'innerHTML', {
        get: function() {           
            try {
                var childNode = this.firstChild;
                while (childNode) {
                    node.append($.clone(childNode));
                    childNode = childNode.nextSibling;
                }
                return node.html();
            } finally {
                node.empty();
            }
        }
    })
})();

设置html使用:

$(svg).html()

在 IE11 上测试

作为解决方法,您可以将 SVG 元素附加到临时 DIV,获取 DIV 的内部 html 并从该字符串中删除 SVG 开始和结束标记.

let parentHtml = $('<div />').append($('svg')).html();
let svgInner = parentHtml.replace(/(<svg)([^<]*|[^>]*)/g, '').replace('</svg>', '');
alert(svgInner);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg"
      xmlns:xlink="http://www.w3.org/1999/xlink">
    <rect x="10" y="10" height="100" width="100"
          style="stroke:#ff0000; fill: #0000ff"/>
</svg>

你可以创建自己的innerHTML,像下面这样setSVG: enter image description here

其实只需要注意两步:创建SVG上下文标签和设置属性(with context)

createElementNS 和 setAttributeNS 是您可能需要的两个方法!

常用命名空间如下:

对于实际标签的内部内容,您可以使用以下内容:

function innerHTML(anySvgElement) {
  var d = document.createElement('div');
  d.appendChild(anySvgElement);
  // Given all SVG tags contain only letters and no numbers, we can strip out the outer tag (the anySvgElement itself)
  return d.innerHTML.replace(/<([a-z]+)[^>]+>(.*)(<\/>)/i, '')
}

对于纯文本的内部内容,请改用 node.textContent