marko/runtime/dom-insert.js
2017-02-25 16:29:32 -07:00

81 lines
2.8 KiB
JavaScript

var extend = require('raptor-util/extend');
var componentsUtil = require('../components/util');
var destroyComponentForEl = componentsUtil.$__destroyComponentForEl;
var destroyElRecursive = componentsUtil.$__destroyElRecursive;
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) {
destroyElRecursive(referenceEl);
destroyComponentForEl(referenceEl);
}
module.exports = function(target, getEl, afterInsert) {
extend(target, {
appendTo: function(referenceEl) {
referenceEl = resolveEl(referenceEl);
var el = getEl(this, referenceEl);
referenceEl.appendChild(el);
return afterInsert(this, referenceEl);
},
prependTo: function(referenceEl) {
referenceEl = resolveEl(referenceEl);
var el = getEl(this, referenceEl);
referenceEl.insertBefore(el, referenceEl.firstChild || null);
return afterInsert(this, referenceEl);
},
replace: function(referenceEl) {
referenceEl = resolveEl(referenceEl);
var el = getEl(this, referenceEl);
beforeRemove(referenceEl);
referenceEl.parentNode.replaceChild(el, 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
if (curChild.nodeType == 1) {
beforeRemove(curChild);
}
curChild = nextSibling;
}
referenceEl.innerHTML = '';
referenceEl.appendChild(el);
return afterInsert(this, referenceEl);
},
insertBefore: function(referenceEl) {
referenceEl = resolveEl(referenceEl);
var el = getEl(this, referenceEl);
referenceEl.parentNode.insertBefore(el, referenceEl);
return afterInsert(this, referenceEl);
},
insertAfter: function(referenceEl) {
referenceEl = resolveEl(referenceEl);
var el = getEl(this, referenceEl);
el = el;
var nextSibling = referenceEl.nextSibling;
var parentNode = referenceEl.parentNode;
if (nextSibling) {
parentNode.insertBefore(el, nextSibling);
} else {
parentNode.appendChild(el);
}
return afterInsert(this, referenceEl);
}
});
};