Skip to content
Permalink
Browse files

Fix #7157. Animation callbacks shouldn't see an element as :animated.

Unless of course, there are other animations to be done! Closes gh-775.
  • Loading branch information...
gnarf authored and dmethvin committed May 18, 2012
1 parent f1dcaad commit 6bf3f20d4e0f69ab14702152880a0574623490e2
Showing with 40 additions and 27 deletions.
  1. +29 −27 src/effects.js
  2. +11 −0 test/unit/effects.js
@@ -49,6 +49,7 @@ function callTweeners( animation, props ) {
length = collection.length;
for ( ; index < length; index++ ) {
if ( collection[ index ].call( animation, prop, value ) ) {

// we're done with this property
return;
}
@@ -63,14 +64,33 @@ function Animation( elem, properties, options ) {
length = animationPrefilters.length,
finished = jQuery.Deferred(),
deferred = jQuery.Deferred().always(function( ended ) {
// remove cirular reference
delete animation.tick;

// don't match elem in the :animated selector
delete tick.elem;
if ( deferred.state() === "resolved" || ended ) {

// fire callbacks
finished.resolveWith( this );
}
}),
tick = function() {
var currentTime = fxNow || createFxNow(),
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
percent = 1 - ( remaining / animation.duration || 0 ),
index = 0,
length = animation.tweens.length;

for ( ; index < length ; index++ ) {
animation.tweens[ index ].run( percent );
}

if ( percent < 1 && length ) {
return remaining;
} else {
deferred.resolveWith( elem, [ currentTime ] );
return false;
}
},
animation = deferred.promise({
elem: elem,
props: jQuery.extend( {}, properties ),
@@ -87,24 +107,6 @@ function Animation( elem, properties, options ) {
animation.tweens.push( tween );
return tween;
},
tick: function() {
var currentTime = fxNow || createFxNow(),
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
percent = 1 - ( remaining / animation.duration || 0 ),
index = 0,
length = animation.tweens.length;

for ( ; index < length ; index++ ) {
animation.tweens[ index ].run( percent );
}

if ( percent < 1 && length ) {
return remaining;
} else {
deferred.resolveWith( elem, [ currentTime ] );
return false;
}
},
stop: function( gotoEnd ) {
var index = 0,
// if we are going to the end, we want to run all the tweens
@@ -132,13 +134,13 @@ function Animation( elem, properties, options ) {

callTweeners( animation, props );

jQuery.extend( animation.tick, {
anim: animation,
queue: animation.opts.queue,
elem: elem
});

jQuery.fx.timer( animation.tick );
jQuery.fx.timer(
jQuery.extend( tick, {
anim: animation,
queue: animation.opts.queue,
elem: elem
})
);
return animation;
}

@@ -1509,3 +1509,14 @@ asyncTest( "User supplied callback called after show when fx off (#8892)", 2, fu
});
});
});

asyncTest("Animation callback should not show animated element as animated (#7157)", 1, function() {
var foo = jQuery( "#foo" );

foo.animate({
opacity: 0
}, 100, function() {
ok( !foo.is(':animated'), "The element is not animated" );
start();
});
});

0 comments on commit 6bf3f20

Please sign in to comment.
You can’t perform that action at this time.