/src/fragmentmanager.ts
interface TagProperties { [key: string]: string } function getNode(node: string | HTMLElement) { if (typeof node == 'string') { return document.getElementById(node); if (!node) { throw new Error('Could not find destination node ' + node); } } return node; } export default class FragmentManager { elem: HTMLElement constructor(html: string, tagName: string = 'div', tagProperties: TagProperties = {}) { this.elem = document.createElement(tagName); for (let k of Object.keys(tagProperties)) { this.elem.setAttribute(k, tagProperties[k]); } this.elem.innerHTML = html; } mount(destNode: string | HTMLElement) { getNode(destNode).appendChild(this.elem); } /* mountInto puts the children into the specified node. Because this * adopts an existing node, be careful when unmounting. */ mountInto(destNode: string | HTMLElement) { destNode = getNode(destNode); while (this.elem.firstChild) { destNode.appendChild(this.elem.firstChild); } this.elem = destNode; } unmount() { if (this.elem.parentNode) this.elem.parentNode.removeChild(this.elem); } q(query: string) { return this.elem.querySelector(query); } }