forked from cujojs/wire
-
Notifications
You must be signed in to change notification settings - Fork 2
/
dom.js
120 lines (97 loc) · 2.96 KB
/
dom.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/** @license MIT License (c) copyright B Cavalier & J Hann */
/**
* wire/dom plugin
* wire plugin that provides a resource resolver for dom nodes, by id, in the
* current page. This allows easy wiring of page-specific dom references into
* generic components that may be page-independent, i.e. makes it easier to write
* components that can be used on multiple pages, but still require a reference
* to one or more nodes on the page.
*
* wire is part of the cujo.js family of libraries (http://cujojs.com/)
*
* Licensed under the MIT License at:
* http://www.opensource.org/licenses/mit-license.php
*/
define(['wire/domReady'], function(domReady) {
/**
* Resolves a reference to a dom node on the page by its id
*
* @param resolver
* @param name
*/
function byId(resolver, name /*, refObj, wire*/) {
domReady(function() {
var node = document.getElementById(name);
if(node) {
resolver.resolve(node);
} else {
resolver.reject(new Error("No DOM node with id: " + name));
}
});
}
/**
* The usual addClass function
*
* @param node
* @param cls {String} space separated list of classes
*/
function addClass(node, cls) {
var className = node.className ? ' ' + node.className + ' ' : '';
cls = cls.split(/\s+/);
for (var i = 0, len = cls.length; i < len; i++) {
var c = ' ' + cls[i];
if(className.indexOf(c + ' ') < 0) {
className += c;
}
}
node.className = className.slice(1, className.length);
}
/**
* The usual removeClass function
*
* @param node
* @param cls {String} space separated list of classes
*/
function removeClass(node, cls) {
var className = ' ' + node.className + ' ';
cls = cls.split(/\s+/);
for (var i = 0, len = cls.length; i < len; i++) {
var c = ' ' + cls[i] + ' ';
className = className.replace(c, ' ');
}
node.className = className.replace(/(^\s+|\s+$)/g, '');
}
function handleClasses(node, add, remove) {
if(add) addClass(node, add);
if(remove) removeClass(node, remove);
}
/**
* Wire plugin. Since this plugin has no context-specific needs or
* functionality, can always return the same object.
*/
var wirePlugin = {
resolvers: {
dom: byId
}
};
return {
wire$plugin: function domPlugin(ready, destroyed, options) {
var node, classes;
classes = options.classes;
// Add/remove lifecycle classes if specified
if(classes) {
node = document.getElementsByTagName('html')[0];
// Add classes for wiring start
handleClasses(node, classes.init);
// Add/remove classes for context ready
ready.then(function() { handleClasses(node, classes.ready, classes.init); });
if(classes.ready) {
// Remove classes for context destroyed
destroyed.then(function() { handleClasses(node, null, classes.ready); });
}
}
// return the same instance every time, see above.
return wirePlugin;
}
};
});