From 58fd0d68bc8b46b23f8cdc65190f08d4e524eb57 Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Wed, 28 Nov 2018 12:57:52 +0100 Subject: Fix build chain so that we now have multiple builds. Details below: - svg.js: The esm bundle - svg.min.js: The bundle for all browsers for maximum support - svg.node.js: The bundle for node - polyfill.js: Using svg.min.js requires this polyfill in case the Browser does not understand all of ./config/polyfillList.js - polyfillIE.js: This is required when you use IE11 (polyfill.js still required) Please note, that not all test pass for IE11 due to its rounding issues and wrong calculation of bbox. Also note, that `defaultPrevented` is not working for CustomEvents in IE11. --- src/polyfills/children.js | 8 ++++ src/polyfills/innerHTML.js | 95 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 src/polyfills/children.js create mode 100644 src/polyfills/innerHTML.js (limited to 'src/polyfills') diff --git a/src/polyfills/children.js b/src/polyfills/children.js new file mode 100644 index 0000000..98e9143 --- /dev/null +++ b/src/polyfills/children.js @@ -0,0 +1,8 @@ +import { filter } from '../utils/utils.js' + +// IE11: children does not work for svg nodes +export default function children (node) { + return filter(node.childNodes, function (child) { + return child.nodeType === 1 + }) +} diff --git a/src/polyfills/innerHTML.js b/src/polyfills/innerHTML.js new file mode 100644 index 0000000..4be7f1b --- /dev/null +++ b/src/polyfills/innerHTML.js @@ -0,0 +1,95 @@ +/* globals SVGElement, DOMParser */ + +(function () { + try { + if (SVGElement.prototype.innerHTML) return + } catch (e) { return } + + var serializeXML = function (node, output) { + var 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, '\'') + }) + } + if (node.hasChildNodes()) { + output.push('>'); + [].forEach.call(node.childNodes, function (childNode) { + serializeXML(childNode, output) + }) + output.push('') + } else { + output.push('/>') + } + } else if (nodeType === 8) { + output.push('') + } + } + + Object.defineProperty(SVGElement.prototype, 'innerHTML', { + get: function () { + var output = [] + var 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 { + var dXML = new DOMParser() + dXML.async = false + + var sXML = '' + markupText + '' + var svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement + + var 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 () { + var output = [] + serializeXML(this, output) + return output.join('') + }, + set: function (markupText) { + while (this.firstChild) { + this.removeChild(this.firstChild) + } + + try { + var dXML = new DOMParser() + dXML.async = false + + var sXML = '' + markupText + '' + var svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement + + var 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') + }; + } + }) +})() -- cgit v1.2.3