Mercurial > nebulaweb3
comparison default/node_modules/jquery/src/effects.js @ 0:1d038bc9b3d2 default tip
Up:default
author | Liny <dev@neowd.com> |
---|---|
date | Sat, 31 May 2025 09:21:51 +0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1d038bc9b3d2 |
---|---|
1 define( [ | |
2 "./core", | |
3 "./core/camelCase", | |
4 "./var/document", | |
5 "./var/isFunction", | |
6 "./var/rcssNum", | |
7 "./var/rnothtmlwhite", | |
8 "./css/var/cssExpand", | |
9 "./css/var/isHiddenWithinTree", | |
10 "./css/var/swap", | |
11 "./css/adjustCSS", | |
12 "./data/var/dataPriv", | |
13 "./css/showHide", | |
14 | |
15 "./core/init", | |
16 "./queue", | |
17 "./deferred", | |
18 "./traversing", | |
19 "./manipulation", | |
20 "./css", | |
21 "./effects/Tween" | |
22 ], function( jQuery, camelCase, document, isFunction, rcssNum, rnothtmlwhite, cssExpand, | |
23 isHiddenWithinTree, swap, adjustCSS, dataPriv, showHide ) { | |
24 | |
25 "use strict"; | |
26 | |
27 var | |
28 fxNow, inProgress, | |
29 rfxtypes = /^(?:toggle|show|hide)$/, | |
30 rrun = /queueHooks$/; | |
31 | |
32 function schedule() { | |
33 if ( inProgress ) { | |
34 if ( document.hidden === false && window.requestAnimationFrame ) { | |
35 window.requestAnimationFrame( schedule ); | |
36 } else { | |
37 window.setTimeout( schedule, jQuery.fx.interval ); | |
38 } | |
39 | |
40 jQuery.fx.tick(); | |
41 } | |
42 } | |
43 | |
44 // Animations created synchronously will run synchronously | |
45 function createFxNow() { | |
46 window.setTimeout( function() { | |
47 fxNow = undefined; | |
48 } ); | |
49 return ( fxNow = Date.now() ); | |
50 } | |
51 | |
52 // Generate parameters to create a standard animation | |
53 function genFx( type, includeWidth ) { | |
54 var which, | |
55 i = 0, | |
56 attrs = { height: type }; | |
57 | |
58 // If we include width, step value is 1 to do all cssExpand values, | |
59 // otherwise step value is 2 to skip over Left and Right | |
60 includeWidth = includeWidth ? 1 : 0; | |
61 for ( ; i < 4; i += 2 - includeWidth ) { | |
62 which = cssExpand[ i ]; | |
63 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; | |
64 } | |
65 | |
66 if ( includeWidth ) { | |
67 attrs.opacity = attrs.width = type; | |
68 } | |
69 | |
70 return attrs; | |
71 } | |
72 | |
73 function createTween( value, prop, animation ) { | |
74 var tween, | |
75 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), | |
76 index = 0, | |
77 length = collection.length; | |
78 for ( ; index < length; index++ ) { | |
79 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { | |
80 | |
81 // We're done with this property | |
82 return tween; | |
83 } | |
84 } | |
85 } | |
86 | |
87 function defaultPrefilter( elem, props, opts ) { | |
88 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, | |
89 isBox = "width" in props || "height" in props, | |
90 anim = this, | |
91 orig = {}, | |
92 style = elem.style, | |
93 hidden = elem.nodeType && isHiddenWithinTree( elem ), | |
94 dataShow = dataPriv.get( elem, "fxshow" ); | |
95 | |
96 // Queue-skipping animations hijack the fx hooks | |
97 if ( !opts.queue ) { | |
98 hooks = jQuery._queueHooks( elem, "fx" ); | |
99 if ( hooks.unqueued == null ) { | |
100 hooks.unqueued = 0; | |
101 oldfire = hooks.empty.fire; | |
102 hooks.empty.fire = function() { | |
103 if ( !hooks.unqueued ) { | |
104 oldfire(); | |
105 } | |
106 }; | |
107 } | |
108 hooks.unqueued++; | |
109 | |
110 anim.always( function() { | |
111 | |
112 // Ensure the complete handler is called before this completes | |
113 anim.always( function() { | |
114 hooks.unqueued--; | |
115 if ( !jQuery.queue( elem, "fx" ).length ) { | |
116 hooks.empty.fire(); | |
117 } | |
118 } ); | |
119 } ); | |
120 } | |
121 | |
122 // Detect show/hide animations | |
123 for ( prop in props ) { | |
124 value = props[ prop ]; | |
125 if ( rfxtypes.test( value ) ) { | |
126 delete props[ prop ]; | |
127 toggle = toggle || value === "toggle"; | |
128 if ( value === ( hidden ? "hide" : "show" ) ) { | |
129 | |
130 // Pretend to be hidden if this is a "show" and | |
131 // there is still data from a stopped show/hide | |
132 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { | |
133 hidden = true; | |
134 | |
135 // Ignore all other no-op show/hide data | |
136 } else { | |
137 continue; | |
138 } | |
139 } | |
140 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); | |
141 } | |
142 } | |
143 | |
144 // Bail out if this is a no-op like .hide().hide() | |
145 propTween = !jQuery.isEmptyObject( props ); | |
146 if ( !propTween && jQuery.isEmptyObject( orig ) ) { | |
147 return; | |
148 } | |
149 | |
150 // Restrict "overflow" and "display" styles during box animations | |
151 if ( isBox && elem.nodeType === 1 ) { | |
152 | |
153 // Support: IE <=9 - 11, Edge 12 - 15 | |
154 // Record all 3 overflow attributes because IE does not infer the shorthand | |
155 // from identically-valued overflowX and overflowY and Edge just mirrors | |
156 // the overflowX value there. | |
157 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; | |
158 | |
159 // Identify a display type, preferring old show/hide data over the CSS cascade | |
160 restoreDisplay = dataShow && dataShow.display; | |
161 if ( restoreDisplay == null ) { | |
162 restoreDisplay = dataPriv.get( elem, "display" ); | |
163 } | |
164 display = jQuery.css( elem, "display" ); | |
165 if ( display === "none" ) { | |
166 if ( restoreDisplay ) { | |
167 display = restoreDisplay; | |
168 } else { | |
169 | |
170 // Get nonempty value(s) by temporarily forcing visibility | |
171 showHide( [ elem ], true ); | |
172 restoreDisplay = elem.style.display || restoreDisplay; | |
173 display = jQuery.css( elem, "display" ); | |
174 showHide( [ elem ] ); | |
175 } | |
176 } | |
177 | |
178 // Animate inline elements as inline-block | |
179 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { | |
180 if ( jQuery.css( elem, "float" ) === "none" ) { | |
181 | |
182 // Restore the original display value at the end of pure show/hide animations | |
183 if ( !propTween ) { | |
184 anim.done( function() { | |
185 style.display = restoreDisplay; | |
186 } ); | |
187 if ( restoreDisplay == null ) { | |
188 display = style.display; | |
189 restoreDisplay = display === "none" ? "" : display; | |
190 } | |
191 } | |
192 style.display = "inline-block"; | |
193 } | |
194 } | |
195 } | |
196 | |
197 if ( opts.overflow ) { | |
198 style.overflow = "hidden"; | |
199 anim.always( function() { | |
200 style.overflow = opts.overflow[ 0 ]; | |
201 style.overflowX = opts.overflow[ 1 ]; | |
202 style.overflowY = opts.overflow[ 2 ]; | |
203 } ); | |
204 } | |
205 | |
206 // Implement show/hide animations | |
207 propTween = false; | |
208 for ( prop in orig ) { | |
209 | |
210 // General show/hide setup for this element animation | |
211 if ( !propTween ) { | |
212 if ( dataShow ) { | |
213 if ( "hidden" in dataShow ) { | |
214 hidden = dataShow.hidden; | |
215 } | |
216 } else { | |
217 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); | |
218 } | |
219 | |
220 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" | |
221 if ( toggle ) { | |
222 dataShow.hidden = !hidden; | |
223 } | |
224 | |
225 // Show elements before animating them | |
226 if ( hidden ) { | |
227 showHide( [ elem ], true ); | |
228 } | |
229 | |
230 /* eslint-disable no-loop-func */ | |
231 | |
232 anim.done( function() { | |
233 | |
234 /* eslint-enable no-loop-func */ | |
235 | |
236 // The final step of a "hide" animation is actually hiding the element | |
237 if ( !hidden ) { | |
238 showHide( [ elem ] ); | |
239 } | |
240 dataPriv.remove( elem, "fxshow" ); | |
241 for ( prop in orig ) { | |
242 jQuery.style( elem, prop, orig[ prop ] ); | |
243 } | |
244 } ); | |
245 } | |
246 | |
247 // Per-property setup | |
248 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); | |
249 if ( !( prop in dataShow ) ) { | |
250 dataShow[ prop ] = propTween.start; | |
251 if ( hidden ) { | |
252 propTween.end = propTween.start; | |
253 propTween.start = 0; | |
254 } | |
255 } | |
256 } | |
257 } | |
258 | |
259 function propFilter( props, specialEasing ) { | |
260 var index, name, easing, value, hooks; | |
261 | |
262 // camelCase, specialEasing and expand cssHook pass | |
263 for ( index in props ) { | |
264 name = camelCase( index ); | |
265 easing = specialEasing[ name ]; | |
266 value = props[ index ]; | |
267 if ( Array.isArray( value ) ) { | |
268 easing = value[ 1 ]; | |
269 value = props[ index ] = value[ 0 ]; | |
270 } | |
271 | |
272 if ( index !== name ) { | |
273 props[ name ] = value; | |
274 delete props[ index ]; | |
275 } | |
276 | |
277 hooks = jQuery.cssHooks[ name ]; | |
278 if ( hooks && "expand" in hooks ) { | |
279 value = hooks.expand( value ); | |
280 delete props[ name ]; | |
281 | |
282 // Not quite $.extend, this won't overwrite existing keys. | |
283 // Reusing 'index' because we have the correct "name" | |
284 for ( index in value ) { | |
285 if ( !( index in props ) ) { | |
286 props[ index ] = value[ index ]; | |
287 specialEasing[ index ] = easing; | |
288 } | |
289 } | |
290 } else { | |
291 specialEasing[ name ] = easing; | |
292 } | |
293 } | |
294 } | |
295 | |
296 function Animation( elem, properties, options ) { | |
297 var result, | |
298 stopped, | |
299 index = 0, | |
300 length = Animation.prefilters.length, | |
301 deferred = jQuery.Deferred().always( function() { | |
302 | |
303 // Don't match elem in the :animated selector | |
304 delete tick.elem; | |
305 } ), | |
306 tick = function() { | |
307 if ( stopped ) { | |
308 return false; | |
309 } | |
310 var currentTime = fxNow || createFxNow(), | |
311 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), | |
312 | |
313 // Support: Android 2.3 only | |
314 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) | |
315 temp = remaining / animation.duration || 0, | |
316 percent = 1 - temp, | |
317 index = 0, | |
318 length = animation.tweens.length; | |
319 | |
320 for ( ; index < length; index++ ) { | |
321 animation.tweens[ index ].run( percent ); | |
322 } | |
323 | |
324 deferred.notifyWith( elem, [ animation, percent, remaining ] ); | |
325 | |
326 // If there's more to do, yield | |
327 if ( percent < 1 && length ) { | |
328 return remaining; | |
329 } | |
330 | |
331 // If this was an empty animation, synthesize a final progress notification | |
332 if ( !length ) { | |
333 deferred.notifyWith( elem, [ animation, 1, 0 ] ); | |
334 } | |
335 | |
336 // Resolve the animation and report its conclusion | |
337 deferred.resolveWith( elem, [ animation ] ); | |
338 return false; | |
339 }, | |
340 animation = deferred.promise( { | |
341 elem: elem, | |
342 props: jQuery.extend( {}, properties ), | |
343 opts: jQuery.extend( true, { | |
344 specialEasing: {}, | |
345 easing: jQuery.easing._default | |
346 }, options ), | |
347 originalProperties: properties, | |
348 originalOptions: options, | |
349 startTime: fxNow || createFxNow(), | |
350 duration: options.duration, | |
351 tweens: [], | |
352 createTween: function( prop, end ) { | |
353 var tween = jQuery.Tween( elem, animation.opts, prop, end, | |
354 animation.opts.specialEasing[ prop ] || animation.opts.easing ); | |
355 animation.tweens.push( tween ); | |
356 return tween; | |
357 }, | |
358 stop: function( gotoEnd ) { | |
359 var index = 0, | |
360 | |
361 // If we are going to the end, we want to run all the tweens | |
362 // otherwise we skip this part | |
363 length = gotoEnd ? animation.tweens.length : 0; | |
364 if ( stopped ) { | |
365 return this; | |
366 } | |
367 stopped = true; | |
368 for ( ; index < length; index++ ) { | |
369 animation.tweens[ index ].run( 1 ); | |
370 } | |
371 | |
372 // Resolve when we played the last frame; otherwise, reject | |
373 if ( gotoEnd ) { | |
374 deferred.notifyWith( elem, [ animation, 1, 0 ] ); | |
375 deferred.resolveWith( elem, [ animation, gotoEnd ] ); | |
376 } else { | |
377 deferred.rejectWith( elem, [ animation, gotoEnd ] ); | |
378 } | |
379 return this; | |
380 } | |
381 } ), | |
382 props = animation.props; | |
383 | |
384 propFilter( props, animation.opts.specialEasing ); | |
385 | |
386 for ( ; index < length; index++ ) { | |
387 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); | |
388 if ( result ) { | |
389 if ( isFunction( result.stop ) ) { | |
390 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = | |
391 result.stop.bind( result ); | |
392 } | |
393 return result; | |
394 } | |
395 } | |
396 | |
397 jQuery.map( props, createTween, animation ); | |
398 | |
399 if ( isFunction( animation.opts.start ) ) { | |
400 animation.opts.start.call( elem, animation ); | |
401 } | |
402 | |
403 // Attach callbacks from options | |
404 animation | |
405 .progress( animation.opts.progress ) | |
406 .done( animation.opts.done, animation.opts.complete ) | |
407 .fail( animation.opts.fail ) | |
408 .always( animation.opts.always ); | |
409 | |
410 jQuery.fx.timer( | |
411 jQuery.extend( tick, { | |
412 elem: elem, | |
413 anim: animation, | |
414 queue: animation.opts.queue | |
415 } ) | |
416 ); | |
417 | |
418 return animation; | |
419 } | |
420 | |
421 jQuery.Animation = jQuery.extend( Animation, { | |
422 | |
423 tweeners: { | |
424 "*": [ function( prop, value ) { | |
425 var tween = this.createTween( prop, value ); | |
426 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); | |
427 return tween; | |
428 } ] | |
429 }, | |
430 | |
431 tweener: function( props, callback ) { | |
432 if ( isFunction( props ) ) { | |
433 callback = props; | |
434 props = [ "*" ]; | |
435 } else { | |
436 props = props.match( rnothtmlwhite ); | |
437 } | |
438 | |
439 var prop, | |
440 index = 0, | |
441 length = props.length; | |
442 | |
443 for ( ; index < length; index++ ) { | |
444 prop = props[ index ]; | |
445 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; | |
446 Animation.tweeners[ prop ].unshift( callback ); | |
447 } | |
448 }, | |
449 | |
450 prefilters: [ defaultPrefilter ], | |
451 | |
452 prefilter: function( callback, prepend ) { | |
453 if ( prepend ) { | |
454 Animation.prefilters.unshift( callback ); | |
455 } else { | |
456 Animation.prefilters.push( callback ); | |
457 } | |
458 } | |
459 } ); | |
460 | |
461 jQuery.speed = function( speed, easing, fn ) { | |
462 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { | |
463 complete: fn || !fn && easing || | |
464 isFunction( speed ) && speed, | |
465 duration: speed, | |
466 easing: fn && easing || easing && !isFunction( easing ) && easing | |
467 }; | |
468 | |
469 // Go to the end state if fx are off | |
470 if ( jQuery.fx.off ) { | |
471 opt.duration = 0; | |
472 | |
473 } else { | |
474 if ( typeof opt.duration !== "number" ) { | |
475 if ( opt.duration in jQuery.fx.speeds ) { | |
476 opt.duration = jQuery.fx.speeds[ opt.duration ]; | |
477 | |
478 } else { | |
479 opt.duration = jQuery.fx.speeds._default; | |
480 } | |
481 } | |
482 } | |
483 | |
484 // Normalize opt.queue - true/undefined/null -> "fx" | |
485 if ( opt.queue == null || opt.queue === true ) { | |
486 opt.queue = "fx"; | |
487 } | |
488 | |
489 // Queueing | |
490 opt.old = opt.complete; | |
491 | |
492 opt.complete = function() { | |
493 if ( isFunction( opt.old ) ) { | |
494 opt.old.call( this ); | |
495 } | |
496 | |
497 if ( opt.queue ) { | |
498 jQuery.dequeue( this, opt.queue ); | |
499 } | |
500 }; | |
501 | |
502 return opt; | |
503 }; | |
504 | |
505 jQuery.fn.extend( { | |
506 fadeTo: function( speed, to, easing, callback ) { | |
507 | |
508 // Show any hidden elements after setting opacity to 0 | |
509 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() | |
510 | |
511 // Animate to the value specified | |
512 .end().animate( { opacity: to }, speed, easing, callback ); | |
513 }, | |
514 animate: function( prop, speed, easing, callback ) { | |
515 var empty = jQuery.isEmptyObject( prop ), | |
516 optall = jQuery.speed( speed, easing, callback ), | |
517 doAnimation = function() { | |
518 | |
519 // Operate on a copy of prop so per-property easing won't be lost | |
520 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); | |
521 | |
522 // Empty animations, or finishing resolves immediately | |
523 if ( empty || dataPriv.get( this, "finish" ) ) { | |
524 anim.stop( true ); | |
525 } | |
526 }; | |
527 doAnimation.finish = doAnimation; | |
528 | |
529 return empty || optall.queue === false ? | |
530 this.each( doAnimation ) : | |
531 this.queue( optall.queue, doAnimation ); | |
532 }, | |
533 stop: function( type, clearQueue, gotoEnd ) { | |
534 var stopQueue = function( hooks ) { | |
535 var stop = hooks.stop; | |
536 delete hooks.stop; | |
537 stop( gotoEnd ); | |
538 }; | |
539 | |
540 if ( typeof type !== "string" ) { | |
541 gotoEnd = clearQueue; | |
542 clearQueue = type; | |
543 type = undefined; | |
544 } | |
545 if ( clearQueue && type !== false ) { | |
546 this.queue( type || "fx", [] ); | |
547 } | |
548 | |
549 return this.each( function() { | |
550 var dequeue = true, | |
551 index = type != null && type + "queueHooks", | |
552 timers = jQuery.timers, | |
553 data = dataPriv.get( this ); | |
554 | |
555 if ( index ) { | |
556 if ( data[ index ] && data[ index ].stop ) { | |
557 stopQueue( data[ index ] ); | |
558 } | |
559 } else { | |
560 for ( index in data ) { | |
561 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { | |
562 stopQueue( data[ index ] ); | |
563 } | |
564 } | |
565 } | |
566 | |
567 for ( index = timers.length; index--; ) { | |
568 if ( timers[ index ].elem === this && | |
569 ( type == null || timers[ index ].queue === type ) ) { | |
570 | |
571 timers[ index ].anim.stop( gotoEnd ); | |
572 dequeue = false; | |
573 timers.splice( index, 1 ); | |
574 } | |
575 } | |
576 | |
577 // Start the next in the queue if the last step wasn't forced. | |
578 // Timers currently will call their complete callbacks, which | |
579 // will dequeue but only if they were gotoEnd. | |
580 if ( dequeue || !gotoEnd ) { | |
581 jQuery.dequeue( this, type ); | |
582 } | |
583 } ); | |
584 }, | |
585 finish: function( type ) { | |
586 if ( type !== false ) { | |
587 type = type || "fx"; | |
588 } | |
589 return this.each( function() { | |
590 var index, | |
591 data = dataPriv.get( this ), | |
592 queue = data[ type + "queue" ], | |
593 hooks = data[ type + "queueHooks" ], | |
594 timers = jQuery.timers, | |
595 length = queue ? queue.length : 0; | |
596 | |
597 // Enable finishing flag on private data | |
598 data.finish = true; | |
599 | |
600 // Empty the queue first | |
601 jQuery.queue( this, type, [] ); | |
602 | |
603 if ( hooks && hooks.stop ) { | |
604 hooks.stop.call( this, true ); | |
605 } | |
606 | |
607 // Look for any active animations, and finish them | |
608 for ( index = timers.length; index--; ) { | |
609 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { | |
610 timers[ index ].anim.stop( true ); | |
611 timers.splice( index, 1 ); | |
612 } | |
613 } | |
614 | |
615 // Look for any animations in the old queue and finish them | |
616 for ( index = 0; index < length; index++ ) { | |
617 if ( queue[ index ] && queue[ index ].finish ) { | |
618 queue[ index ].finish.call( this ); | |
619 } | |
620 } | |
621 | |
622 // Turn off finishing flag | |
623 delete data.finish; | |
624 } ); | |
625 } | |
626 } ); | |
627 | |
628 jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { | |
629 var cssFn = jQuery.fn[ name ]; | |
630 jQuery.fn[ name ] = function( speed, easing, callback ) { | |
631 return speed == null || typeof speed === "boolean" ? | |
632 cssFn.apply( this, arguments ) : | |
633 this.animate( genFx( name, true ), speed, easing, callback ); | |
634 }; | |
635 } ); | |
636 | |
637 // Generate shortcuts for custom animations | |
638 jQuery.each( { | |
639 slideDown: genFx( "show" ), | |
640 slideUp: genFx( "hide" ), | |
641 slideToggle: genFx( "toggle" ), | |
642 fadeIn: { opacity: "show" }, | |
643 fadeOut: { opacity: "hide" }, | |
644 fadeToggle: { opacity: "toggle" } | |
645 }, function( name, props ) { | |
646 jQuery.fn[ name ] = function( speed, easing, callback ) { | |
647 return this.animate( props, speed, easing, callback ); | |
648 }; | |
649 } ); | |
650 | |
651 jQuery.timers = []; | |
652 jQuery.fx.tick = function() { | |
653 var timer, | |
654 i = 0, | |
655 timers = jQuery.timers; | |
656 | |
657 fxNow = Date.now(); | |
658 | |
659 for ( ; i < timers.length; i++ ) { | |
660 timer = timers[ i ]; | |
661 | |
662 // Run the timer and safely remove it when done (allowing for external removal) | |
663 if ( !timer() && timers[ i ] === timer ) { | |
664 timers.splice( i--, 1 ); | |
665 } | |
666 } | |
667 | |
668 if ( !timers.length ) { | |
669 jQuery.fx.stop(); | |
670 } | |
671 fxNow = undefined; | |
672 }; | |
673 | |
674 jQuery.fx.timer = function( timer ) { | |
675 jQuery.timers.push( timer ); | |
676 jQuery.fx.start(); | |
677 }; | |
678 | |
679 jQuery.fx.interval = 13; | |
680 jQuery.fx.start = function() { | |
681 if ( inProgress ) { | |
682 return; | |
683 } | |
684 | |
685 inProgress = true; | |
686 schedule(); | |
687 }; | |
688 | |
689 jQuery.fx.stop = function() { | |
690 inProgress = null; | |
691 }; | |
692 | |
693 jQuery.fx.speeds = { | |
694 slow: 600, | |
695 fast: 200, | |
696 | |
697 // Default speed | |
698 _default: 400 | |
699 }; | |
700 | |
701 return jQuery; | |
702 } ); |