marko
Version:
UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.
77 lines (71 loc) • 2.5 kB
JavaScript
;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);
}
});
};