UNPKG

2.55 kBJavaScriptView Raw
1var extend = require("raptor-util/extend");
2var componentsUtil = require("./components/util");
3var destroyComponentForNode = componentsUtil.___destroyComponentForNode;
4var destroyNodeRecursive = componentsUtil.___destroyNodeRecursive;
5var helpers = require("./vdom/morphdom/helpers");
6
7var insertBefore = helpers.___insertBefore;
8var insertAfter = helpers.___insertAfter;
9var removeChild = helpers.___removeChild;
10
11function resolveEl(el) {
12 if (typeof el == "string") {
13 var elId = el;
14 el = document.getElementById(elId);
15 if (!el) {
16 throw Error("Not found: " + elId);
17 }
18 }
19 return el;
20}
21
22function beforeRemove(referenceEl) {
23 destroyNodeRecursive(referenceEl);
24 destroyComponentForNode(referenceEl);
25}
26
27module.exports = function(target, getEl, afterInsert) {
28 extend(target, {
29 appendTo: function(referenceEl) {
30 referenceEl = resolveEl(referenceEl);
31 var el = getEl(this, referenceEl);
32 insertBefore(el, null, referenceEl);
33 return afterInsert(this, referenceEl);
34 },
35 prependTo: function(referenceEl) {
36 referenceEl = resolveEl(referenceEl);
37 var el = getEl(this, referenceEl);
38 insertBefore(el, referenceEl.firstChild || null, referenceEl);
39 return afterInsert(this, referenceEl);
40 },
41 replace: function(referenceEl) {
42 referenceEl = resolveEl(referenceEl);
43 var el = getEl(this, referenceEl);
44 beforeRemove(referenceEl);
45 insertBefore(el, referenceEl, referenceEl.parentNode);
46 removeChild(referenceEl);
47 return afterInsert(this, referenceEl);
48 },
49 replaceChildrenOf: function(referenceEl) {
50 referenceEl = resolveEl(referenceEl);
51 var el = getEl(this, referenceEl);
52
53 var curChild = referenceEl.firstChild;
54 while (curChild) {
55 var nextSibling = curChild.nextSibling; // Just in case the DOM changes while removing
56 beforeRemove(curChild);
57 curChild = nextSibling;
58 }
59
60 referenceEl.innerHTML = "";
61 insertBefore(el, null, referenceEl);
62 return afterInsert(this, referenceEl);
63 },
64 insertBefore: function(referenceEl) {
65 referenceEl = resolveEl(referenceEl);
66 var el = getEl(this, referenceEl);
67 insertBefore(el, referenceEl, referenceEl.parentNode);
68 return afterInsert(this, referenceEl);
69 },
70 insertAfter: function(referenceEl) {
71 referenceEl = resolveEl(referenceEl);
72 var el = getEl(this, referenceEl);
73 insertAfter(el, referenceEl, referenceEl.parentNode);
74 return afterInsert(this, referenceEl);
75 }
76 });
77};