diff --git a/AUTHORS.txt b/AUTHORS.txt index fea67a6c3..9ce13edf2 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -166,3 +166,4 @@ Dmitry Gusev Michał Gołębiowski Steven Benner Li Xudong +Renato Oliveira dos Santos diff --git a/src/effects.js b/src/effects.js index 7f54dd56e..a1ba37707 100644 --- a/src/effects.js +++ b/src/effects.js @@ -304,21 +304,29 @@ function defaultPrefilter( elem, props, opts ) { // show/hide pass + dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} ); for ( index in props ) { value = props[ index ]; if ( rfxtypes.exec( value ) ) { delete props[ index ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { + + // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden + if( value === "show" && dataShow[ index ] !== undefined ) { + hidden = true; + } else { continue; } + } handled.push( index ); } } length = handled.length; - if ( length ) { + if ( !length ) { dataShow = data_priv.get( elem, "fxshow" ) || data_priv.access( elem, "fxshow", {} ); + } else { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } diff --git a/test/unit/effects.js b/test/unit/effects.js index b8e49ba45..1b2bee85a 100644 --- a/test/unit/effects.js +++ b/test/unit/effects.js @@ -2033,4 +2033,64 @@ test( ".finish() calls finish of custom queue functions", function() { div.remove(); }); +asyncTest( "slideDown() after stop() (#13483)", 2, function() { + var ul = jQuery( "
    " ), + origHeight = ul.height(); + + // First test. slideUp() -> stop() in the middle -> slideDown() until the end + ul.slideUp( 1000 ); + setTimeout( function() { + ul.stop( true ); + ul.slideDown( 1, function() { + equal( ul.height(), origHeight, "slideDown() after interrupting slideUp() with stop(). Height must be in original value" ); + + // Second test. slideDown() -> stop() in the middle -> slideDown() until the end + ul.slideUp( 1, function() { + ul.slideDown( 1000 ); + setTimeout( function() { + ul.stop( true ); + ul.slideDown( 1, function() { + equal( ul.height(), origHeight, "slideDown() after interrupting slideDown() with stop(). Height must be in original value" ); + + // Cleanup + ul.remove(); + start(); + }); + }, 500 ); + }); + + }); + }, 500 ); +}); + +asyncTest( "fadeIn() after stop() (related to #13483)", 2, function() { + var ul = jQuery( "
      " ), + origOpacity = ul.css( "opacity" ); + + // First test. fadeOut() -> stop() in the middle -> fadeIn() until the end + ul.fadeOut( 1000 ); + setTimeout( function() { + ul.stop( true ); + ul.fadeIn( 1, function() { + equal( ul.css( "opacity" ), origOpacity, "fadeIn() after interrupting fadeOut() with stop(). Opacity must be in original value" ); + + // Second test. fadeIn() -> stop() in the middle -> fadeIn() until the end + ul.fadeOut( 1, function() { + ul.fadeIn( 1000 ); + setTimeout( function() { + ul.stop( true ); + ul.fadeIn( 1, function() { + equal( ul.css("opacity"), origOpacity, "fadeIn() after interrupting fadeIn() with stop(). Opacity must be in original value" ); + + // Cleanup + ul.remove(); + start(); + }); + }, 500 ); + }); + + }); + }, 500 ); +}); + })();