UNPKG

marko

Version:

UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.

77 lines (71 loc) 2.5 kB
"use strict";var extend = require("raptor-util/extend"); var componentsUtil = require("@internal/components-util"); var destroyComponentForNode = componentsUtil._S_; var destroyNodeRecursive = componentsUtil._T_; var helpers = require("./vdom/morphdom/helpers"); var insertBefore = helpers.bh_; var insertAfter = helpers.bi_; var removeChild = helpers.bj_; function resolveEl(el) { if (typeof el == "string") { var elId = el; el = document.getElementById(elId); if (!el) { throw Error("Not found: " + elId); } } return el; } function beforeRemove(referenceEl) { destroyNodeRecursive(referenceEl); destroyComponentForNode(referenceEl); } module.exports = function (target, getEl, afterInsert) { extend(target, { appendTo: function (referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); insertBefore(el, null, referenceEl); return afterInsert(this, referenceEl); }, prependTo: function (referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); insertBefore(el, referenceEl.firstChild || null, referenceEl); return afterInsert(this, referenceEl); }, replace: function (referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); beforeRemove(referenceEl); insertBefore(el, referenceEl, referenceEl.parentNode); removeChild(referenceEl); return afterInsert(this, referenceEl); }, replaceChildrenOf: function (referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); var curChild = referenceEl.firstChild; while (curChild) { var nextSibling = curChild.nextSibling; // Just in case the DOM changes while removing beforeRemove(curChild); curChild = nextSibling; } referenceEl.innerHTML = ""; insertBefore(el, null, referenceEl); return afterInsert(this, referenceEl); }, insertBefore: function (referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); insertBefore(el, referenceEl, referenceEl.parentNode); return afterInsert(this, referenceEl); }, insertAfter: function (referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); insertAfter(el, referenceEl, referenceEl.parentNode); return afterInsert(this, referenceEl); } }); };