-
Notifications
You must be signed in to change notification settings - Fork 2
/
class.js
95 lines (90 loc) · 2.15 KB
/
class.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
/**
* IE9 does not support `Element.classList`, when support for IE9 is
* dropped this can be refactored.
*/
var attr = 'class';
/**
* Adds the specified class(es) to each of the set of matched elements.
*/
function addClass(className) {
if(!className) {
return this;
}
var classes = className.split(/\s+/);
this.each(function(el) {
var val = el.getAttribute(attr);
var names = val ? val.split(/\s+/) : [];
classes.forEach(function(nm) {
if(!~names.indexOf(nm)) {
names.push(nm);
}
});
el.setAttribute(attr, names.join(' '));
});
return this;
}
/**
* Determine whether any of the matched elements are assigned the
* given class.
*/
function hasClass(className) {
var i, val;
for(i = 0;i < this.length;i++) {
val = this.get(i).getAttribute(attr);
val = val ? val.split(/\s+/) : [];
if(~val.indexOf(className)) {
return true;
}
}
return false;
}
/**
* Remove a single class, multiple classes, or all classes from
* each element in the set of matched elements.
*/
function removeClass(className) {
if(!className) {
// remove all classes from all matched elements
this.each(function(el) {
el.removeAttribute(attr);
});
return this;
}
var classes = className.split(/\s+/);
this.each(function(el) {
var val = el.getAttribute(attr);
// no class attribute - nothing to remove
if(!val) {
return;
}
var names = val.split(/\s+/);
names = names.filter(function(nm) {
return ~classes.indexOf(nm) ? false : nm;
});
el.setAttribute(attr, names.join(' '));
});
return this;
}
/**
* Add or remove one or more classes from each element in the set of
* matched elements depending on the class's presence.
*/
function toggleClass(className) {
var classes = className.split(/\s+/)
, name
, i;
for(i = 0;i < classes.length;i++) {
name = classes[i];
if(this.hasClass(name)) {
this.removeClass(name)
}else{
this.addClass(name)
}
}
}
module.exports = function() {
this.addClass = addClass;
this.hasClass = hasClass;
this.removeClass = removeClass;
this.toggleClass = toggleClass;
}