ratchet_design 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/ratchet/favicon.ico +0 -0
- data/app/assets/javascripts/ratchet/base/form.js +117 -8
- data/app/assets/javascripts/ratchet/base/mobilemenu.js +50 -12
- data/app/assets/javascripts/ratchet/base/validation.js +263 -0
- data/app/assets/javascripts/ratchet/core.js +78 -57
- data/app/assets/javascripts/ratchet/enhancement/_collapse.js +6 -3
- data/app/assets/javascripts/ratchet/enhancement/_lightbox.js +93 -0
- data/app/assets/javascripts/ratchet/enhancement/_swap.js +7 -3
- data/app/assets/javascripts/ratchet/{utility → enhancement}/loader.js +8 -15
- data/app/assets/javascripts/ratchet/enhancement/notice.js +3 -8
- data/app/assets/javascripts/ratchet/enhancement/sticky.js +35 -18
- data/app/assets/javascripts/ratchet/enhancement/waypoints.js +162 -125
- data/app/assets/javascripts/ratchet/shim/classlist.js +234 -0
- data/app/assets/javascripts/ratchet/shim/object.assign.js +30 -0
- data/app/assets/javascripts/ratchet/utility/ajax.js +122 -0
- data/app/assets/javascripts/ratchet/utility/compile_data.js +40 -0
- data/app/assets/javascripts/ratchet/utility/from_top.js +14 -0
- data/app/assets/javascripts/ratchet/utility/full_stop.js +55 -0
- data/app/assets/javascripts/ratchet/utility/get_closest.js +20 -0
- data/app/assets/javascripts/ratchet/utility/get_next.js +17 -0
- data/app/assets/javascripts/ratchet/utility/matches.js +15 -0
- data/app/assets/javascripts/ratchet/utility/scroll_to.js +74 -0
- data/app/assets/javascripts/ratchet/utility/throttle.js +25 -0
- data/app/assets/javascripts/ratchet/utility/timeout.js +45 -0
- data/app/assets/javascripts/ratchet/utility/unhover.js +56 -0
- data/app/assets/javascripts/ratchet/utility/word_count.js +15 -0
- data/app/assets/stylesheets/ratchet/_core.scss +2 -4
- data/app/assets/stylesheets/ratchet/base/_button.scss +1 -1
- data/app/assets/stylesheets/ratchet/base/_form.scss +50 -61
- data/app/assets/stylesheets/ratchet/base/_text.scss +8 -8
- data/app/assets/stylesheets/ratchet/{utility → enhancement}/_loader.scss +1 -1
- data/app/assets/stylesheets/ratchet/enhancement/_tooltip.scss +1 -6
- data/app/assets/stylesheets/ratchet/utility/_global.scss +12 -2
- data/app/helpers/ratchet/application_helper.rb +2 -28
- data/app/views/layouts/ratchet/default.html.slim +4 -5
- data/app/views/shared/ratchet/_footer.html.slim +2 -3
- data/app/views/shared/ratchet/_header.html.slim +1 -1
- data/lib/ratchet_design/version.rb +1 -1
- data/lib/ratchet_design.rb +0 -1
- data/public/assets/ratchet/core-0.1.6.js +105 -0
- data/public/assets/ratchet/core-0.1.6.js.gz +0 -0
- data/public/assets/ratchet/core-0.1.6.map.json +1 -0
- data/public/assets/ratchet/{fonts-woff-0.1.5.css → fonts-woff-0.1.6.css} +0 -0
- data/public/assets/ratchet/{fonts-woff-0.1.5.css.gz → fonts-woff-0.1.6.css.gz} +0 -0
- data/public/assets/ratchet/{fonts-woff2-0.1.5.css → fonts-woff2-0.1.6.css} +0 -0
- data/public/assets/ratchet/{fonts-woff2-0.1.5.css.gz → fonts-woff2-0.1.6.css.gz} +0 -0
- metadata +28 -47
- data/app/assets/images/ratchet/safari-pinned-tab.svg +0 -1
- data/app/assets/javascripts/ratchet/base/sync-input-value.js +0 -30
- data/app/assets/javascripts/ratchet/enhancement/lightbox.js +0 -165
- data/app/assets/javascripts/ratchet/shim/scope.js +0 -94
- data/app/assets/stylesheets/ratchet/base/_multistep-form.scss +0 -64
- data/app/assets/stylesheets/ratchet/enhancement/_lightbox.scss +0 -98
- data/app/helpers/ratchet/form_helper.rb +0 -140
- data/public/assets/ratchet/core-0.1.5.js +0 -133
- data/public/assets/ratchet/core-0.1.5.js.gz +0 -0
- data/public/assets/ratchet/core-0.1.5.map.json +0 -1
@@ -6,93 +6,129 @@
|
|
6
6
|
**/
|
7
7
|
|
8
8
|
// Dependencies
|
9
|
-
var
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
getClosest = toolbox.getClosest,
|
15
|
-
callback = Event.callback;
|
9
|
+
var matches = require( '../utility/matches' ),
|
10
|
+
fromTop = require( '../utility/from_top' ),
|
11
|
+
scrollTo = require( '../utility/scroll_to' ),
|
12
|
+
getClosest = require( '../utility/get_closest' ),
|
13
|
+
throttle = require( '../utility/throttle' );
|
16
14
|
|
17
15
|
// Public API function
|
18
|
-
var waypoints = function( settings ) {
|
16
|
+
var waypoints = function( elements, settings ) {
|
19
17
|
|
20
18
|
// Overridable defaults
|
21
19
|
var defaults = {
|
22
|
-
initWidth : '
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
}
|
20
|
+
initWidth : '700px',
|
21
|
+
activeAnchor : 'active',
|
22
|
+
elemOffset : 0,
|
23
|
+
showLandmarks : false,
|
24
|
+
landmarkSelector : '.landmark',
|
25
|
+
activeLandmark : 'pinned',
|
26
|
+
};
|
29
27
|
|
30
28
|
// Scoped variables
|
31
|
-
var options
|
32
|
-
|
33
|
-
landmarkSelector = 'dl',
|
34
|
-
activeLandmark = 'pinned',
|
35
|
-
nav = document.querySelector('.waypoint-nav'),
|
36
|
-
elements = [];
|
29
|
+
var options = Object.assign( {}, defaults, settings ),
|
30
|
+
selectors = document.querySelectorAll( elements );
|
37
31
|
|
38
|
-
|
32
|
+
// If selectors are not present
|
33
|
+
if ( !selectors.length ) {
|
39
34
|
|
40
|
-
//
|
41
|
-
|
35
|
+
// Abort
|
36
|
+
return false;
|
42
37
|
|
43
|
-
|
44
|
-
|
38
|
+
// Otherwise attach listeners
|
39
|
+
} else {
|
45
40
|
|
46
|
-
|
41
|
+
// Scoped variables
|
42
|
+
var initWidth = options.initWidth ? options.initWidth : '0px',
|
43
|
+
widthQuery = window.matchMedia( '(min-width: ' + initWidth + ')' ),
|
44
|
+
docBody = document.body,
|
45
|
+
coordinates = [],
|
46
|
+
oldActiveItem,
|
47
|
+
windowHash,
|
48
|
+
docHeight,
|
49
|
+
winHeight;
|
47
50
|
|
48
|
-
|
51
|
+
// If hash is present
|
52
|
+
if ( window.location.hash ) {
|
49
53
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
docHeight,
|
56
|
-
winHeight;
|
54
|
+
// Cache it
|
55
|
+
windowHash = window.location.hash.replace( '#', '' );
|
56
|
+
|
57
|
+
// Then delete it to prevent default page scroll
|
58
|
+
window.location.hash = '';
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
+
// And replace it
|
61
|
+
history.replaceState( null, '', '#' + windowHash );
|
60
62
|
|
61
|
-
|
62
|
-
|
63
|
+
}
|
64
|
+
|
65
|
+
// Resize throttle function init
|
66
|
+
throttle( 'resize', 'optimizedResize' );
|
67
|
+
|
68
|
+
// Scroll throttle function init
|
69
|
+
throttle( 'scroll', 'optimizedScroll' );
|
63
70
|
|
64
|
-
//
|
65
|
-
window.
|
71
|
+
// Only run once the window is loaded
|
72
|
+
window.addEventListener( 'load', function() {
|
66
73
|
|
67
|
-
|
68
|
-
|
74
|
+
// Call listener function explicitly at run time
|
75
|
+
queryHandler( widthQuery );
|
76
|
+
|
77
|
+
// Attach listener function to listen in on state changes
|
78
|
+
widthQuery.addListener( queryHandler );
|
79
|
+
|
80
|
+
}, false );
|
69
81
|
|
70
82
|
}
|
71
83
|
|
72
|
-
//
|
73
|
-
|
84
|
+
// Media query handler function
|
85
|
+
function queryHandler( condition ) {
|
86
|
+
|
87
|
+
// If media query matches
|
88
|
+
if ( condition.matches ) {
|
74
89
|
|
75
|
-
|
76
|
-
|
90
|
+
// Call resize listener function explicitly at run time
|
91
|
+
resizeHandler();
|
77
92
|
|
78
|
-
//
|
79
|
-
|
80
|
-
resize()
|
93
|
+
// Resize throttle function init
|
94
|
+
window.addEventListener( 'optimizedResize', resizeHandler, false );
|
81
95
|
|
82
|
-
//
|
83
|
-
|
84
|
-
scroll()
|
85
|
-
|
86
|
-
// Set up hash change listener
|
87
|
-
hashChange.toggle( condition.matches )
|
88
|
-
hashChange()
|
96
|
+
// Call scroll listener function explicitly at run time
|
97
|
+
scrollHandler();
|
89
98
|
|
90
|
-
|
99
|
+
// Scroll function listener
|
100
|
+
window.addEventListener( 'optimizedScroll', scrollHandler, false );
|
91
101
|
|
92
|
-
|
102
|
+
// Click function listener
|
103
|
+
docBody.addEventListener( 'click', clickHandler, false );
|
104
|
+
|
105
|
+
// Call hash change listener function explicitly at run time
|
106
|
+
hashHandler();
|
107
|
+
|
108
|
+
// Hash change function listener
|
109
|
+
window.addEventListener( 'hashchange', hashHandler, false );
|
110
|
+
|
111
|
+
// Otherwise…
|
112
|
+
} else {
|
113
|
+
|
114
|
+
// Remove resize listener
|
115
|
+
window.removeEventListener( 'optimizedResize', resizeHandler, false );
|
116
|
+
|
117
|
+
// Remove scroll listener
|
118
|
+
window.removeEventListener( 'optimizedScroll', scrollHandler, false );
|
119
|
+
|
120
|
+
// Remove click listener
|
121
|
+
docBody.removeEventListener( 'click', clickHandler, false );
|
122
|
+
|
123
|
+
// Remove hash change listener
|
124
|
+
window.removeEventListener( 'hashchange', hashHandler, false );
|
125
|
+
|
126
|
+
}
|
127
|
+
|
128
|
+
}
|
93
129
|
|
94
130
|
// Resize handler function
|
95
|
-
|
131
|
+
function resizeHandler() {
|
96
132
|
|
97
133
|
// Update document height variable
|
98
134
|
docHeight = docBody.scrollHeight;
|
@@ -101,22 +137,23 @@ var waypoints = function( settings ) {
|
|
101
137
|
winHeight = window.innerHeight;
|
102
138
|
|
103
139
|
// Loop through waypoints
|
104
|
-
|
140
|
+
for ( var i = 0; i < selectors.length; i++ ) {
|
105
141
|
|
106
|
-
|
142
|
+
// Construct coordinate object
|
143
|
+
var coordinate = {
|
144
|
+
elem : selectors[ i ],
|
145
|
+
offset : fromTop( selectors[ i ] )
|
146
|
+
};
|
147
|
+
|
148
|
+
// And update coordinates array
|
149
|
+
coordinates[ i ] = coordinate;
|
150
|
+
|
151
|
+
}
|
107
152
|
|
108
|
-
// Store coordinates to elements
|
109
|
-
var setCoordinates = function() {
|
110
|
-
elements.forEach( function( element, i ) {
|
111
|
-
coordinates[ i ] = {
|
112
|
-
elem : elements[ i ],
|
113
|
-
offset : fromTop( elements[ i ] )
|
114
|
-
}
|
115
|
-
})
|
116
153
|
}
|
117
154
|
|
118
155
|
// Scroll handler function
|
119
|
-
|
156
|
+
function scrollHandler() {
|
120
157
|
|
121
158
|
// Scoped variables
|
122
159
|
var newScrollY = window.pageYOffset,
|
@@ -126,10 +163,11 @@ var waypoints = function( settings ) {
|
|
126
163
|
landmark;
|
127
164
|
|
128
165
|
// Loop through coordinates
|
129
|
-
|
166
|
+
for ( var i = 0; i < coordinates.length; i++ ) {
|
130
167
|
|
131
168
|
// Scoped variables
|
132
169
|
var firstWaypoint = coordinates[ 0 ],
|
170
|
+
currWaypoint = coordinates[ i ],
|
133
171
|
nextWaypoint = coordinates[ i + 1 ],
|
134
172
|
lastWaypoint = coordinates[ coordinates.length - 1 ];
|
135
173
|
|
@@ -153,65 +191,76 @@ var waypoints = function( settings ) {
|
|
153
191
|
|
154
192
|
}
|
155
193
|
|
156
|
-
}
|
194
|
+
}
|
157
195
|
|
158
196
|
// If active item exists
|
159
197
|
if ( newActiveItem ) {
|
160
198
|
|
161
199
|
// Only run when new active item is triggered
|
162
|
-
if ( newActiveItem === oldActiveItem ) return false
|
200
|
+
if ( newActiveItem === oldActiveItem ) return false;
|
163
201
|
|
164
202
|
// Update active link
|
165
|
-
activeLink =
|
203
|
+
activeLink = docBody.querySelector( 'a[href="#' + newActiveItem + '"]' );
|
166
204
|
|
167
205
|
// If no active link is found, abort
|
168
|
-
if ( !activeLink ) return false
|
206
|
+
if ( !activeLink ) return false;
|
169
207
|
|
170
208
|
// And enable navigation item
|
171
|
-
|
209
|
+
activate( activeLink, options.activeAnchor );
|
210
|
+
|
211
|
+
// If landmarks are turned on
|
212
|
+
if ( options.showLandmarks === true ) {
|
213
|
+
|
214
|
+
// Set active landmark to active link’s parent
|
215
|
+
landmark = getClosest( activeLink, options.landmarkSelector );
|
216
|
+
|
217
|
+
// Enable active landmark
|
218
|
+
activate( landmark, options.activeLandmark );
|
219
|
+
|
220
|
+
}
|
172
221
|
|
173
222
|
// Update old active item variable
|
174
|
-
oldActiveItem = newActiveItem
|
223
|
+
oldActiveItem = newActiveItem;
|
175
224
|
|
176
225
|
}
|
177
226
|
|
178
|
-
}
|
227
|
+
}
|
179
228
|
|
180
229
|
// Click handler function
|
181
|
-
|
230
|
+
function clickHandler( event ) {
|
182
231
|
|
183
232
|
// Matches selector function init
|
184
233
|
if ( matches( event.target, 'a[href^="#"]' ) ) {
|
185
234
|
|
186
235
|
// Prevent default behavior
|
187
|
-
event.preventDefault()
|
236
|
+
event.preventDefault();
|
188
237
|
|
189
238
|
// Travel to clicked target
|
190
|
-
travel( event.target,
|
239
|
+
travel( event.target, 'click' );
|
191
240
|
|
192
241
|
}
|
193
|
-
}
|
242
|
+
}
|
194
243
|
|
195
244
|
// Hash change handler function
|
196
|
-
|
245
|
+
function hashHandler() {
|
197
246
|
|
198
247
|
// Only run when a hash is present
|
199
|
-
if ( !window.location.hash ) return false
|
248
|
+
if ( !window.location.hash ) return false;
|
200
249
|
|
201
250
|
// Find the hash’s relevant navigation item
|
202
|
-
var hashAnchor = document.querySelector( 'a[href="' + window.location.hash + '"]' )
|
251
|
+
var hashAnchor = document.querySelector( 'a[href="' + window.location.hash + '"]' );
|
203
252
|
|
204
253
|
// And travel to its target
|
205
|
-
travel( hashAnchor )
|
254
|
+
travel( hashAnchor, 'hash' );
|
206
255
|
|
207
|
-
}
|
256
|
+
}
|
208
257
|
|
209
258
|
// Window scroll travel function
|
210
|
-
|
259
|
+
function travel( destination, trigger ) {
|
211
260
|
|
212
261
|
// Define scoped variable(s)
|
213
|
-
var targetAnchor = destination.
|
214
|
-
targetElement = document.querySelector( targetAnchor ),
|
262
|
+
var targetAnchor = destination.href.split( '#' )[ 1 ],
|
263
|
+
targetElement = document.querySelector( '#' + targetAnchor ),
|
215
264
|
targetOffset,
|
216
265
|
travelTime;
|
217
266
|
|
@@ -219,10 +268,10 @@ var waypoints = function( settings ) {
|
|
219
268
|
if ( targetElement ) {
|
220
269
|
|
221
270
|
// Enable new active navigation item
|
222
|
-
|
271
|
+
activate( destination, options.activeAnchor );
|
223
272
|
|
224
273
|
// Loop through coordinates
|
225
|
-
|
274
|
+
for ( var i = 0; i < coordinates.length; i++ ) {
|
226
275
|
|
227
276
|
// If coordinate element matches target element
|
228
277
|
if ( coordinates[ i ].elem === targetElement ) {
|
@@ -230,61 +279,49 @@ var waypoints = function( settings ) {
|
|
230
279
|
// Assign its coordinates to target offset variable
|
231
280
|
targetOffset = coordinates[ i ].offset;
|
232
281
|
}
|
233
|
-
}
|
282
|
+
}
|
234
283
|
|
235
284
|
// If trigger was a click
|
236
|
-
if (
|
285
|
+
if ( trigger === 'click' ) {
|
237
286
|
|
238
287
|
// Temporarily remove scroll listener function
|
239
|
-
|
288
|
+
window.removeEventListener( 'optimizedScroll', scrollHandler, false );
|
240
289
|
|
241
290
|
// Update the hash
|
242
|
-
history.pushState( null, '', targetAnchor );
|
291
|
+
history.pushState( null, '', '#' + targetAnchor );
|
292
|
+
|
293
|
+
// Animate scroll to appropriate element
|
294
|
+
scrollTo( targetOffset - options.elemOffset + 1, function() {
|
295
|
+
|
296
|
+
// Once scroll is complete, enable scroll listener
|
297
|
+
window.addEventListener( 'optimizedScroll', scrollHandler, false );
|
243
298
|
|
244
|
-
|
245
|
-
scrollTo( targetElement, scroll.start )
|
299
|
+
});
|
246
300
|
|
247
|
-
|
301
|
+
// Otherwise if trigger was a hash
|
302
|
+
} else if ( trigger === 'hash' ) {
|
248
303
|
|
249
304
|
// Skip the scroll animation
|
250
|
-
window.scrollTo( 0,
|
305
|
+
window.scrollTo( 0, targetOffset - options.elemOffset + 1 );
|
251
306
|
|
252
307
|
}
|
253
308
|
}
|
254
309
|
}
|
255
310
|
|
256
|
-
|
311
|
+
// Link activation function
|
312
|
+
function activate( selector, cls ) {
|
257
313
|
|
258
314
|
// Find currently active link
|
259
|
-
var
|
260
|
-
|
261
|
-
if ( activeEl == el ) return
|
315
|
+
var activeLink = docBody.querySelector( '.' + cls );
|
262
316
|
|
263
|
-
//
|
264
|
-
if (
|
317
|
+
// And if it exists, disable it
|
318
|
+
if ( activeLink ) activeLink.classList.remove( cls );
|
265
319
|
|
266
320
|
// Then enable the passed selector
|
267
|
-
|
268
|
-
|
269
|
-
}
|
270
|
-
|
271
|
-
// Link activation function
|
272
|
-
function activateLink( el ) {
|
273
|
-
activate( el, activeAnchor )
|
321
|
+
selector.classList.add( cls );
|
274
322
|
|
275
|
-
// Set active landmark to active link’s parent
|
276
|
-
activateLandmark( getClosest( el, landmarkSelector ) )
|
277
323
|
}
|
278
324
|
|
279
|
-
function activateLandmark( el ) {
|
280
|
-
if ( el ) activate( el, activeLandmark )
|
281
|
-
}
|
282
|
-
|
283
|
-
Event.resize.stop( resize )
|
284
|
-
Event.scroll( scroll )
|
285
|
-
Event.on( document, 'click', click )
|
286
|
-
Event.on( window, 'hashchange', hashChange )
|
287
|
-
|
288
325
|
};
|
289
326
|
|
290
327
|
// Public API
|
@@ -0,0 +1,234 @@
|
|
1
|
+
/**
|
2
|
+
* ClassList
|
3
|
+
* Cross-browser full element.classList implementation
|
4
|
+
* @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js
|
5
|
+
* @author Eli Grey - http://eligrey.com
|
6
|
+
* @license MIT
|
7
|
+
**/
|
8
|
+
|
9
|
+
if ( 'document' in self ) {
|
10
|
+
|
11
|
+
// Full polyfill for browsers with no classList support
|
12
|
+
if ( !( 'classList' in document.createElement( '_' ) ) ) {
|
13
|
+
|
14
|
+
( function( view ) {
|
15
|
+
|
16
|
+
'use strict';
|
17
|
+
|
18
|
+
if ( !( 'Element' in view ) ) return;
|
19
|
+
|
20
|
+
var
|
21
|
+
classListProp = 'classList',
|
22
|
+
protoProp = 'prototype',
|
23
|
+
elemCtrProto = view.Element[ protoProp ],
|
24
|
+
objCtr = Object,
|
25
|
+
|
26
|
+
strTrim = String[ protoProp ].trim || function() {
|
27
|
+
return this.replace( /^\s+|\s+$/g, '' );
|
28
|
+
},
|
29
|
+
|
30
|
+
arrIndexOf = Array[ protoProp ].indexOf || function( item ) {
|
31
|
+
for ( var i = 0; i < this.length; i++ ) {
|
32
|
+
if ( i in this && this[ i ] === item ) {
|
33
|
+
return i;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
return -1;
|
37
|
+
},
|
38
|
+
|
39
|
+
DOMEx = function( type, message ) {
|
40
|
+
this.name = type;
|
41
|
+
this.code = DOMException[ type ];
|
42
|
+
this.message = message;
|
43
|
+
},
|
44
|
+
|
45
|
+
checkTokenAndGetIndex = function( classList, token ) {
|
46
|
+
if ( token === '' ) {
|
47
|
+
throw new DOMEx(
|
48
|
+
'SYNTAX_ERR',
|
49
|
+
'An invalid or illegal string was specified'
|
50
|
+
);
|
51
|
+
}
|
52
|
+
if ( /\s/.test( token ) ) {
|
53
|
+
throw new DOMEx(
|
54
|
+
'INVALID_CHARACTER_ERR',
|
55
|
+
'String contains an invalid character'
|
56
|
+
);
|
57
|
+
}
|
58
|
+
return arrIndexOf.call( classList, token );
|
59
|
+
},
|
60
|
+
|
61
|
+
ClassList = function( elem ) {
|
62
|
+
var trimmedClasses = strTrim.call( elem.getAttribute( 'class' ) || '' ),
|
63
|
+
classes = trimmedClasses ? trimmedClasses.split( /\s+/ ) : [];
|
64
|
+
|
65
|
+
for ( var i = 0; i < classes.length; i++ ) {
|
66
|
+
this.push( classes[ i ] );
|
67
|
+
}
|
68
|
+
|
69
|
+
this._updateClassName = function() {
|
70
|
+
elem.setAttribute( 'class', this.toString() );
|
71
|
+
};
|
72
|
+
},
|
73
|
+
|
74
|
+
classListProto = ClassList[ protoProp ] = [],
|
75
|
+
|
76
|
+
classListGetter = function() {
|
77
|
+
return new ClassList( this );
|
78
|
+
};
|
79
|
+
|
80
|
+
DOMEx[ protoProp ] = Error[ protoProp ];
|
81
|
+
|
82
|
+
classListProto.item = function( i ) {
|
83
|
+
return this[ i ] || null;
|
84
|
+
};
|
85
|
+
|
86
|
+
classListProto.contains = function( token ) {
|
87
|
+
token += '';
|
88
|
+
return checkTokenAndGetIndex( this, token ) !== -1;
|
89
|
+
};
|
90
|
+
|
91
|
+
classListProto.add = function() {
|
92
|
+
var
|
93
|
+
tokens = arguments,
|
94
|
+
iter = 0,
|
95
|
+
len = tokens.length,
|
96
|
+
updated = false,
|
97
|
+
token;
|
98
|
+
|
99
|
+
do {
|
100
|
+
token = tokens[ iter ] + '';
|
101
|
+
if ( checkTokenAndGetIndex( this, token ) === -1 ) {
|
102
|
+
this.push( token );
|
103
|
+
updated = true;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
while ( ++iter < len );
|
108
|
+
|
109
|
+
if ( updated ) {
|
110
|
+
this._updateClassName();
|
111
|
+
}
|
112
|
+
};
|
113
|
+
|
114
|
+
classListProto.remove = function() {
|
115
|
+
var
|
116
|
+
tokens = arguments,
|
117
|
+
iter = 0,
|
118
|
+
len = tokens.length,
|
119
|
+
updated = false,
|
120
|
+
token,
|
121
|
+
index;
|
122
|
+
|
123
|
+
do {
|
124
|
+
token = tokens[ iter ] + '';
|
125
|
+
index = checkTokenAndGetIndex( this, token );
|
126
|
+
|
127
|
+
while ( index !== -1 ) {
|
128
|
+
this.splice( index, 1 );
|
129
|
+
updated = true;
|
130
|
+
index = checkTokenAndGetIndex( this, token );
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
while ( ++iter < len );
|
135
|
+
|
136
|
+
if ( updated ) {
|
137
|
+
this._updateClassName();
|
138
|
+
}
|
139
|
+
};
|
140
|
+
|
141
|
+
classListProto.toggle = function( token, force ) {
|
142
|
+
token += '';
|
143
|
+
|
144
|
+
var
|
145
|
+
result = this.contains( token ),
|
146
|
+
method = result ? force !== true && 'remove' : force !== false && 'add';
|
147
|
+
|
148
|
+
if ( method ) {
|
149
|
+
this[ method ]( token );
|
150
|
+
}
|
151
|
+
|
152
|
+
if ( force === true || force === false ) {
|
153
|
+
return force;
|
154
|
+
} else {
|
155
|
+
return !result;
|
156
|
+
}
|
157
|
+
};
|
158
|
+
|
159
|
+
classListProto.toString = function() {
|
160
|
+
return this.join( ' ' );
|
161
|
+
};
|
162
|
+
|
163
|
+
if ( objCtr.defineProperty ) {
|
164
|
+
var classListPropDesc = {
|
165
|
+
get : classListGetter,
|
166
|
+
enumerable : true,
|
167
|
+
configurable : true
|
168
|
+
};
|
169
|
+
|
170
|
+
try {
|
171
|
+
objCtr.defineProperty( elemCtrProto, classListProp, classListPropDesc );
|
172
|
+
}
|
173
|
+
|
174
|
+
catch ( ex ) {
|
175
|
+
if ( ex.number === -0x7FF5EC54 ) {
|
176
|
+
classListPropDesc.enumerable = false;
|
177
|
+
objCtr.defineProperty( elemCtrProto, classListProp, classListPropDesc );
|
178
|
+
}
|
179
|
+
}
|
180
|
+
|
181
|
+
} else if ( objCtr[ protoProp ].__defineGetter__ ) {
|
182
|
+
elemCtrProto.__defineGetter__( classListProp, classListGetter );
|
183
|
+
}
|
184
|
+
|
185
|
+
}( self ));
|
186
|
+
|
187
|
+
} else {
|
188
|
+
|
189
|
+
( function() {
|
190
|
+
|
191
|
+
'use strict';
|
192
|
+
|
193
|
+
var testElement = document.createElement( '_' );
|
194
|
+
|
195
|
+
testElement.classList.add( 'c1', 'c2' );
|
196
|
+
|
197
|
+
if ( !testElement.classList.contains( 'c2' ) ) {
|
198
|
+
var createMethod = function( method ) {
|
199
|
+
var original = DOMTokenList.prototype[ method ];
|
200
|
+
|
201
|
+
DOMTokenList.prototype[ method ] = function( token ) {
|
202
|
+
var i, len = arguments.length;
|
203
|
+
|
204
|
+
for ( i = 0; i < len; i++ ) {
|
205
|
+
token = arguments[ i ];
|
206
|
+
original.call( this, token );
|
207
|
+
}
|
208
|
+
};
|
209
|
+
};
|
210
|
+
createMethod( 'add' );
|
211
|
+
createMethod( 'remove' );
|
212
|
+
}
|
213
|
+
|
214
|
+
testElement.classList.toggle( 'c3', false );
|
215
|
+
|
216
|
+
if ( testElement.classList.contains( 'c3' ) ) {
|
217
|
+
var _toggle = DOMTokenList.prototype.toggle;
|
218
|
+
|
219
|
+
DOMTokenList.prototype.toggle = function( token, force ) {
|
220
|
+
if ( 1 in arguments && !this.contains( token ) === !force ) {
|
221
|
+
return force;
|
222
|
+
} else {
|
223
|
+
return _toggle.call( this, token );
|
224
|
+
}
|
225
|
+
};
|
226
|
+
|
227
|
+
}
|
228
|
+
|
229
|
+
testElement = null;
|
230
|
+
|
231
|
+
}());
|
232
|
+
|
233
|
+
}
|
234
|
+
}
|