mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
81 lines
2.8 KiB
JavaScript
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);
|
|
}
|
|
});
|
|
};
|