-
Notifications
You must be signed in to change notification settings - Fork 0
/
vibe.js
93 lines (85 loc) · 2.88 KB
/
vibe.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
/*!
* vibe 0.9.4+201403131410
* https://github.com/ryanve/vibe
* MIT License (c) 2014 Ryan Van Etten
*/
(function(root, name, make) {
if (typeof module != 'undefined' && module['exports']) module['exports'] = make();
else root[name] = make();
}(this, 'vibe', function() {
var classList = 'classList'
, subject = typeof document != 'undefined' && document.documentElement[classList]
, hasApi = !!(subject && subject.contains && subject.add && subject.remove)
, whitespace = /\s+/g
, ssv = /\S+/g
, space = ' '
, contains = function(str, token) {
return !!~(space + str.replace(whitespace, space) + space).indexOf(space + token + space);
}
, addClass = hasApi ? function(el, c) {
'' === c || el[classList].add(c);
} : function(el, c) {
contains(el.className, c) || (el.className += space + c);
}
, removeClass = hasApi ? function(el, c) {
'' === c || el[classList].remove(c);
} : function(el, c) {
var diff = 0, s = '', classes = el.className.match(ssv), i = classes && classes.length;
for (c = s + c; i--;) c === classes[i] ? ++diff : s = classes[i] + (s ? space : s) + s;
if (diff) el.className = s;
}
, hasClass = hasApi ? function(el, c) {
return '' === c || !!el[classList].contains(c);
} : function(el, c) {
return contains(el.className, c);
}
, toggleClass = function(el, c, force) {
if ('' === c) return true;
force = typeof force == 'boolean' ? force : !hasClass(el, c);
(force ? addClass : removeClass)(el, c);
return force;
};
/**
* @param {{length:number}} els
* @param {Function} fn method
* @param {string|Array|Function} list of classes or callback to determine them
*/
function bulk(els, fn, list) {
var j, n, i = 0, l = els.length;
if (typeof list == 'function') {
while (i < l) {
n = list.call(els[i]);
if (false === n) break;
bulk([els[i++]], fn, n);
}
} else if (typeof list == 'string' ? list = list.match(ssv) : list) {
for (n = list.length; i < l; i++) {
for (j = 0; j < n; j++) {
fn(els[i], list[j]);
}
}
}
return els;
}
return {
'addClass': addClass
, 'removeClass': removeClass
, 'toggleClass': toggleClass
, 'hasClass': hasClass
, 'fn': {
'addClass': function(list) {
return bulk(this, addClass, list);
}
, 'removeClass': function(list) {
return bulk(this, removeClass, list);
}
, 'toggleClass': function(list, state) {
return bulk(this, true === state ? addClass : false === state ? removeClass : toggleClass, list);
}
, 'hasClass': function(c) {
for (var i = 0, l = this.length; i < l;) if (hasClass(this[i++], c)) return true;
return false;
}
}
};
}));