Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/effects.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
var fxNow, timerId,
rfxtypes = /^(?:toggle|show|hide)$/,
rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
rfxnum = /^(?:([\-+])=)?([\d+.\-]+)([a-z%]*)$/i,
rrun = /queueHooks$/,
animationPrefilters = [ defaultPrefilter ],
tweeners = {
"*": [function( prop, value ) {
var end, unit, prevScale,
tween = this.createTween( prop, value ),
parts = rfxnum.exec( value ),
start = tween.cur(),
scale = 1,
target = start;
target = tween.cur(),
start = +target || 0,
scale = 1;

if ( parts ) {
end = +parts[2];
Expand All @@ -21,7 +21,7 @@ var fxNow, timerId,
// Iteratively approximate from a nonzero starting point
// Prefer the current property, because this process will be trivial if it uses the same units
// Fallback to end or a simple constant
start = parseFloat( jQuery.css( tween.elem, prop ) ) || end || 1;
start = jQuery.css( tween.elem, prop, true ) || end || 1;

do {
// If previous iteration zeroed out, double until we get *something*
Expand All @@ -35,14 +35,14 @@ var fxNow, timerId,
// Update scale, tolerating zeroes from tween.cur()
scale = tween.cur() / target;

// Stop looping if scale is unchanged or we've hit the mark
// Stop looping if we've hit the mark or scale is unchanged
} while ( scale !== 1 && scale !== prevScale );
}

tween.unit = unit;
tween.start = start;
// If a +=/-= token was provided, we're doing a relative animation
tween.end = parts[1] ? start + end * ( parts[1] === "-=" ? -1 : 1 ) : end;
tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
}
return tween;
}]
Expand Down
5 changes: 4 additions & 1 deletion test/data/testsuite.css
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,7 @@ body, div { background: url(http://static.jquery.com/files/rocker/images/logo_jq
#t6652 div { filter: alpha(opacity=50); }

/* #10501 */
section { background:#f0f; display:block; }
section { background:#f0f; display:block; }

/* #11971 */
#foo { background: url(data/1x1.jpg) right bottom no-repeat; }
39 changes: 36 additions & 3 deletions test/unit/effects.js
Original file line number Diff line number Diff line change
Expand Up @@ -1665,13 +1665,40 @@ asyncTest( "animate does not change start value for non-px animation (#7109)", 1
});
});

asyncTest("Animation callbacks (#11797)", 12, function() {
asyncTest( "non-px animation handles non-numeric start (#11971)", 2, function() {
var foo = jQuery("#foo"),
initial = foo.css("backgroundPositionX");

foo.animate({ backgroundPositionX: "42%" }, {
duration: 1,
progress: function( anim, percent ) {
if ( percent ) {
return;
}

if ( parseFloat( initial ) ) {
equal( jQuery.style( this, "backgroundPositionX" ), initial, "Numeric start preserved" );
} else {
equal( jQuery.style( this, "backgroundPositionX" ), "0%", "Non-numeric start zeroed" );
}
},
done: function() {
equal( jQuery.style( this, "backgroundPositionX" ), "42%", "End reached" );
start();
}
});
});

asyncTest("Animation callbacks (#11797)", 15, function() {
var targets = jQuery("#foo").children(),
done = false,
expectedProgress = 0;

targets.eq( 0 ).animate( {}, {
duration: 1,
start: function() {
ok( true, "empty: start" );
},
progress: function( anim, percent ) {
equal( percent, 0, "empty: progress 0" );
},
Expand All @@ -1687,13 +1714,16 @@ asyncTest("Animation callbacks (#11797)", 12, function() {
}
});

ok( done, "animation done" );
ok( done, "empty: done immediately" );

done = false;
targets.eq( 1 ).animate({
opacity: 0
}, {
duration: 1,
start: function() {
ok( true, "stopped: start" );
},
progress: function( anim, percent ) {
equal( percent, 0, "stopped: progress 0" );
},
Expand All @@ -1709,12 +1739,15 @@ asyncTest("Animation callbacks (#11797)", 12, function() {
}
}).stop();

ok( done, "animation stopped" );
ok( done, "stopped: stopped immediately" );

targets.eq( 2 ).animate({
opacity: 0
}, {
duration: 1,
start: function() {
ok( true, "async: start" );
},
progress: function( anim, percent ) {
equal( percent, expectedProgress, "async: progress " + expectedProgress );
// once at 0, once at 1
Expand Down