mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Effects: Resolve issues revealed by recent Callbacks fix
Notify full progress before resolving empty animations
Register animation callbacks before their ticker
Remove the right timer when immediately-done animations spawn more
Ref 9d822bc1c1
Fixes gh-3502
Fixes gh-3503
Closes gh-3496
This commit is contained in:
parent
efdb8a46e4
commit
3c89329cb2
37
src/effects.js
vendored
37
src/effects.js
vendored
@ -315,12 +315,19 @@ function Animation( elem, properties, options ) {
|
|||||||
|
|
||||||
deferred.notifyWith( elem, [ animation, percent, remaining ] );
|
deferred.notifyWith( elem, [ animation, percent, remaining ] );
|
||||||
|
|
||||||
|
// If there's more to do, yield
|
||||||
if ( percent < 1 && length ) {
|
if ( percent < 1 && length ) {
|
||||||
return remaining;
|
return remaining;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
// If this was an empty animation, synthesize a final progress notification
|
||||||
|
if ( !length ) {
|
||||||
|
deferred.notifyWith( elem, [ animation, 1, 0 ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve the animation and report its conclusion
|
||||||
deferred.resolveWith( elem, [ animation ] );
|
deferred.resolveWith( elem, [ animation ] );
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
},
|
},
|
||||||
animation = deferred.promise( {
|
animation = deferred.promise( {
|
||||||
elem: elem,
|
elem: elem,
|
||||||
@ -385,6 +392,13 @@ function Animation( elem, properties, options ) {
|
|||||||
animation.opts.start.call( elem, animation );
|
animation.opts.start.call( elem, animation );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attach callbacks from options
|
||||||
|
animation
|
||||||
|
.progress( animation.opts.progress )
|
||||||
|
.done( animation.opts.done, animation.opts.complete )
|
||||||
|
.fail( animation.opts.fail )
|
||||||
|
.always( animation.opts.always );
|
||||||
|
|
||||||
jQuery.fx.timer(
|
jQuery.fx.timer(
|
||||||
jQuery.extend( tick, {
|
jQuery.extend( tick, {
|
||||||
elem: elem,
|
elem: elem,
|
||||||
@ -393,11 +407,7 @@ function Animation( elem, properties, options ) {
|
|||||||
} )
|
} )
|
||||||
);
|
);
|
||||||
|
|
||||||
// attach callbacks from options
|
return animation;
|
||||||
return animation.progress( animation.opts.progress )
|
|
||||||
.done( animation.opts.done, animation.opts.complete )
|
|
||||||
.fail( animation.opts.fail )
|
|
||||||
.always( animation.opts.always );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jQuery.Animation = jQuery.extend( Animation, {
|
jQuery.Animation = jQuery.extend( Animation, {
|
||||||
@ -641,7 +651,7 @@ jQuery.fx.tick = function() {
|
|||||||
for ( ; i < timers.length; i++ ) {
|
for ( ; i < timers.length; i++ ) {
|
||||||
timer = timers[ i ];
|
timer = timers[ i ];
|
||||||
|
|
||||||
// Checks the timer has not already been removed
|
// Run the timer and safely remove it when done (allowing for external removal)
|
||||||
if ( !timer() && timers[ i ] === timer ) {
|
if ( !timer() && timers[ i ] === timer ) {
|
||||||
timers.splice( i--, 1 );
|
timers.splice( i--, 1 );
|
||||||
}
|
}
|
||||||
@ -654,11 +664,16 @@ jQuery.fx.tick = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
jQuery.fx.timer = function( timer ) {
|
jQuery.fx.timer = function( timer ) {
|
||||||
jQuery.timers.push( timer );
|
var i = jQuery.timers.push( timer ) - 1,
|
||||||
|
timers = jQuery.timers;
|
||||||
|
|
||||||
if ( timer() ) {
|
if ( timer() ) {
|
||||||
jQuery.fx.start();
|
jQuery.fx.start();
|
||||||
} else {
|
|
||||||
jQuery.timers.pop();
|
// If the timer finished immediately, safely remove it (allowing for external removal)
|
||||||
|
// Use a superfluous post-decrement for better compressibility w.r.t. jQuery.fx.tick above
|
||||||
|
} else if ( timers[ i ] === timer ) {
|
||||||
|
timers.splice( i--, 1 );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
17
test/unit/effects.js
vendored
17
test/unit/effects.js
vendored
@ -1256,17 +1256,18 @@ QUnit.test( "animate with CSS shorthand properties", function( assert ) {
|
|||||||
} );
|
} );
|
||||||
|
|
||||||
QUnit.test( "hide hidden elements, with animation (bug #7141)", function( assert ) {
|
QUnit.test( "hide hidden elements, with animation (bug #7141)", function( assert ) {
|
||||||
assert.expect( 3 );
|
assert.expect( 4 );
|
||||||
|
|
||||||
var div = jQuery( "<div style='display:none'></div>" ).appendTo( "#qunit-fixture" );
|
var div = jQuery( "<div id='bug7141' style='display:none'/>" ).appendTo( "#qunit-fixture" );
|
||||||
assert.equal( div.css( "display" ), "none", "Element is hidden by default" );
|
assert.equal( div.css( "display" ), "none", "Element is initially hidden" );
|
||||||
div.hide( 1, function() {
|
div.hide( 10, function() {
|
||||||
assert.ok( !jQuery._data( div, "olddisplay" ), "olddisplay is undefined after hiding an already-hidden element" );
|
assert.equal( div.css( "display" ), "none", "Element is hidden in .hide() callback" );
|
||||||
div.show( 1, function() {
|
div.show( 11, function() {
|
||||||
assert.equal( div.css( "display" ), "block", "Show a double-hidden element" );
|
assert.equal( div.css( "display" ), "block", "Element is visible in .show() callback" );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
this.clock.tick( 10 );
|
this.clock.tick( 50 );
|
||||||
|
assert.equal( div.css( "display" ), "block", "Element is visible after animations" );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
QUnit.test( "animate unit-less properties (#4966)", function( assert ) {
|
QUnit.test( "animate unit-less properties (#4966)", function( assert ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user