aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Gibson <richard.gibson@gmail.com>2013-05-25 10:18:57 -0400
committerRichard Gibson <richard.gibson@gmail.com>2013-05-28 16:49:48 -0400
commit6fd5e480c1cd3e481e7097763ee281b65bc74306 (patch)
treed6a4493c4bab9663ed6d7dc8fa5cb07465fd2db8
parent68c9d0528c43d89cbdab302c68924fb11cd3439c (diff)
downloadjquery-6fd5e480c1cd3e481e7097763ee281b65bc74306.tar.gz
jquery-6fd5e480c1cd3e481e7097763ee281b65bc74306.zip
Fix #13937: Correctly scope .finish() following multi-element .animate(). Thanks @gnarf37. Close gh-1279.
(cherry picked from commit ae9e05e9f3cb071232b056005755acb5926e403e)
-rw-r--r--src/effects.js8
-rw-r--r--src/queue.js1
-rw-r--r--test/unit/effects.js34
3 files changed, 33 insertions, 10 deletions
diff --git a/src/effects.js b/src/effects.js
index cb78b5cfe..b0a9083e7 100644
--- a/src/effects.js
+++ b/src/effects.js
@@ -488,9 +488,7 @@ jQuery.fn.extend({
doAnimation = function() {
// Operate on a copy of prop so per-property easing won't be lost
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
- doAnimation.finish = function() {
- anim.stop( true );
- };
+
// Empty animations, or finishing resolves immediately
if ( empty || data_priv.get( this, "finish" ) ) {
anim.stop( true );
@@ -570,8 +568,8 @@ jQuery.fn.extend({
// empty the queue first
jQuery.queue( this, type, [] );
- if ( hooks && hooks.cur && hooks.cur.finish ) {
- hooks.cur.finish.call( this );
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
}
// look for any active animations, and finish them
diff --git a/src/queue.js b/src/queue.js
index 46b9ba8fc..1297bc1b4 100644
--- a/src/queue.js
+++ b/src/queue.js
@@ -35,7 +35,6 @@ jQuery.extend({
startLength--;
}
- hooks.cur = fn;
if ( fn ) {
// Add a progress sentinel to prevent the fx queue from being
diff --git a/test/unit/effects.js b/test/unit/effects.js
index 05f1c017a..4c4e31495 100644
--- a/test/unit/effects.js
+++ b/test/unit/effects.js
@@ -2096,21 +2096,47 @@ test( ".finish( \"custom\" ) - custom queue animations", function() {
});
test( ".finish() calls finish of custom queue functions", function() {
- function queueTester() {
-
+ function queueTester( next, hooks ) {
+ hooks.stop = function( gotoEnd ) {
+ inside++;
+ equal( this, div[0] );
+ ok( gotoEnd, "hooks.stop(true) called");
+ };
}
- var div = jQuery( "<div>" );
+ var div = jQuery( "<div>" ),
+ inside = 0,
+ outside = 0;
- expect( 3 );
+ expect( 6 );
queueTester.finish = function() {
+ outside++;
ok( true, "Finish called on custom queue function" );
};
div.queue( queueTester ).queue( queueTester ).queue( queueTester ).finish();
+ equal( inside, 1, "1 stop(true) callback" );
+ equal( outside, 2, "2 finish callbacks" );
+
div.remove();
});
+asyncTest( ".finish() is applied correctly when multiple elements were animated (#13937)", function() {
+ expect( 3 );
+
+ var elems = jQuery("<a>0</a><a>1</a><a>2</a>");
+
+ elems.animate( { opacity: 0 }, 1500 ).animate( { opacity: 1 }, 1500 );
+ setTimeout(function() {
+ elems.eq( 1 ).finish();
+ ok( !elems.eq( 1 ).queue().length, "empty queue for .finish()ed element" );
+ ok( elems.eq( 0 ).queue().length, "non-empty queue for preceding element" );
+ ok( elems.eq( 2 ).queue().length, "non-empty queue for following element" );
+ elems.stop( true );
+ start();
+ }, 100 );
+});
+
asyncTest( "slideDown() after stop() (#13483)", 2, function() {
var ul = jQuery( "<ul style='height: 100px;display: block'></ul>" ),
origHeight = ul.height();