1 | import Set from '../set';
|
2 | import * as is from '../is';
|
3 |
|
4 | let elesfn = ({
|
5 | classes: function( classes ){
|
6 | let self = this;
|
7 |
|
8 | if( classes === undefined ){
|
9 | let ret = [];
|
10 |
|
11 | self[0]._private.classes.forEach(cls => ret.push(cls));
|
12 |
|
13 | return ret;
|
14 | } else if( !is.array( classes ) ){
|
15 |
|
16 | classes = ( classes || '' ).match( /\S+/g ) || [];
|
17 | }
|
18 |
|
19 | let changed = [];
|
20 | let classesSet = new Set( classes );
|
21 |
|
22 |
|
23 | for( let j = 0; j < self.length; j++ ){
|
24 | let ele = self[ j ];
|
25 | let _p = ele._private;
|
26 | let eleClasses = _p.classes;
|
27 | let changedEle = false;
|
28 |
|
29 |
|
30 | for( let i = 0; i < classes.length; i++ ){
|
31 | let cls = classes[i];
|
32 | let eleHasClass = eleClasses.has(cls);
|
33 |
|
34 | if( !eleHasClass ){
|
35 | changedEle = true;
|
36 | break;
|
37 | }
|
38 | }
|
39 |
|
40 |
|
41 | if( !changedEle ){
|
42 | changedEle = eleClasses.size !== classes.length;
|
43 | }
|
44 |
|
45 | if( changedEle ){
|
46 | _p.classes = classesSet;
|
47 |
|
48 | changed.push( ele );
|
49 | }
|
50 | }
|
51 |
|
52 |
|
53 | if( changed.length > 0 ){
|
54 | this.spawn( changed )
|
55 | .updateStyle()
|
56 | .emit( 'class' )
|
57 | ;
|
58 | }
|
59 |
|
60 | return self;
|
61 | },
|
62 |
|
63 | addClass: function( classes ){
|
64 | return this.toggleClass( classes, true );
|
65 | },
|
66 |
|
67 | hasClass: function( className ){
|
68 | let ele = this[0];
|
69 | return ( ele != null && ele._private.classes.has(className) );
|
70 | },
|
71 |
|
72 | toggleClass: function( classes, toggle ){
|
73 | if( !is.array( classes ) ){
|
74 |
|
75 | classes = classes.match( /\S+/g ) || [];
|
76 | }
|
77 | let self = this;
|
78 | let toggleUndefd = toggle === undefined;
|
79 | let changed = [];
|
80 |
|
81 | for( let i = 0, il = self.length; i < il; i++ ){
|
82 | let ele = self[ i ];
|
83 | let eleClasses = ele._private.classes;
|
84 | let changedEle = false;
|
85 |
|
86 | for( let j = 0; j < classes.length; j++ ){
|
87 | let cls = classes[ j ];
|
88 | let hasClass = eleClasses.has(cls);
|
89 | let changedNow = false;
|
90 |
|
91 | if( toggle || (toggleUndefd && !hasClass) ){
|
92 | eleClasses.add(cls);
|
93 | changedNow = true;
|
94 | } else if( !toggle || (toggleUndefd && hasClass) ){
|
95 | eleClasses.delete(cls);
|
96 | changedNow = true;
|
97 | }
|
98 |
|
99 | if( !changedEle && changedNow ){
|
100 | changed.push( ele );
|
101 | changedEle = true;
|
102 | }
|
103 |
|
104 | }
|
105 | }
|
106 |
|
107 |
|
108 | if( changed.length > 0 ){
|
109 | this.spawn( changed )
|
110 | .updateStyle()
|
111 | .emit( 'class' )
|
112 | ;
|
113 | }
|
114 |
|
115 | return self;
|
116 | },
|
117 |
|
118 | removeClass: function( classes ){
|
119 | return this.toggleClass( classes, false );
|
120 | },
|
121 |
|
122 | flashClass: function( classes, duration ){
|
123 | let self = this;
|
124 |
|
125 | if( duration == null ){
|
126 | duration = 250;
|
127 | } else if( duration === 0 ){
|
128 | return self;
|
129 | }
|
130 |
|
131 | self.addClass( classes );
|
132 | setTimeout( function(){
|
133 | self.removeClass( classes );
|
134 | }, duration );
|
135 |
|
136 | return self;
|
137 | }
|
138 | });
|
139 |
|
140 | elesfn.className = elesfn.classNames = elesfn.classes;
|
141 |
|
142 | export default elesfn;
|