From 293eb1b1e3630c045cc1a48be5edf96530df3be3 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 19 Nov 2018 18:40:45 +0800 Subject: [PATCH] Add: polyfill element method --- js/polyfill.js | 59 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/js/polyfill.js b/js/polyfill.js index d2b63a37..7de2c83c 100644 --- a/js/polyfill.js +++ b/js/polyfill.js @@ -1,6 +1,53 @@ -if (!Object.entries) { - Object.entries = obj => Object.keys(obj).map(k => [k, obj[k]]); -} -if (!Object.values) { - Object.values = obj => Object.keys(obj).map(k => obj[k]); -} +'use strict'; + +(() => { + if (!Object.entries) { + Object.entries = obj => Object.keys(obj).map(k => [k, obj[k]]); + } + if (!Object.values) { + Object.values = obj => Object.keys(obj).map(k => obj[k]); + } + if (typeof document === 'object') { + const ELEMENT_METH = { + append: { + base: [Element, Document, DocumentFragment], + fn: (node, frag) => { + node.appendChild(frag); + } + }, + prepend: { + base: [Element, Document, DocumentFragment], + fn: (node, frag) => { + node.insertBefore(frag, node.firstChild); + } + }, + before: { + base: [Element, CharacterData, DocumentType], + fn: (node, frag) => { + node.parentNode.insertBefore(frag, node); + } + }, + after: { + base: [Element, CharacterData, DocumentType], + fn: (node, frag) => { + node.parentNode.insertBefore(frag, node.nextSibling); + } + } + }; + + for (const [key, {base, fn}] of Object.entries(ELEMENT_METH)) { + for (const cls of base) { + if (cls.prototype[key]) { + continue; + } + cls.prototype[key] = function (...nodes) { + const frag = document.createDocumentFragment(); + for (const node of nodes) { + frag.appendChild(typeof node === 'string' ? document.createTextNode(node) : node); + } + fn(this, frag); + }; + } + } + } +})();