;(function () { try { if (SVGElement.prototype.innerHTML) return } catch (e) { return } const serializeXML = function (node, output) { const nodeType = node.nodeType if (nodeType === 3) { output.push( node.textContent .replace(/&/, '&') .replace(/', '>') ) } else if (nodeType === 1) { output.push('<', node.tagName) if (node.hasAttributes()) { ;[].forEach.call(node.attributes, function (attrNode) { output.push(' ', attrNode.name, '="', attrNode.value, '"') }) } output.push('>') if (node.hasChildNodes()) { ;[].forEach.call(node.childNodes, function (childNode) { serializeXML(childNode, output) }) } else { // output.push('/>') } output.push('') } else if (nodeType === 8) { output.push('') } } Object.defineProperty(SVGElement.prototype, 'innerHTML', { get: function () { const output = [] let childNode = this.firstChild while (childNode) { serializeXML(childNode, output) childNode = childNode.nextSibling } return output.join('') }, set: function (markupText) { while (this.firstChild) { this.removeChild(this.firstChild) } try { const dXML = new DOMParser() dXML.async = false const sXML = "" + markupText + '' const svgDocElement = dXML.parseFromString( sXML, 'text/xml' ).documentElement let childNode = svgDocElement.firstChild while (childNode) { this.appendChild(this.ownerDocument.importNode(childNode, true)) childNode = childNode.nextSibling } } catch (e) { throw new Error('Can not set innerHTML on node') } } }) Object.defineProperty(SVGElement.prototype, 'outerHTML', { get: function () { const output = [] serializeXML(this, output) return output.join('') }, set: function (markupText) { while (this.firstChild) { this.removeChild(this.firstChild) } try { const dXML = new DOMParser() dXML.async = false const sXML = "" + markupText + '' const svgDocElement = dXML.parseFromString( sXML, 'text/xml' ).documentElement let childNode = svgDocElement.firstChild while (childNode) { this.parentNode.insertBefore( this.ownerDocument.importNode(childNode, true), this ) // this.appendChild(this.ownerDocument.importNode(childNode, true)); childNode = childNode.nextSibling } } catch (e) { throw new Error('Can not set outerHTML on node') } } }) })()