Skip to content

Commit bee4d03

Browse files
committed
Keep track of a hiding state for toggle based animations - Fixes #8685
Closes jquerygh-1018 (cherry picked from commit c45f609) Conflicts: src/effects.js
1 parent c56732f commit bee4d03

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/effects.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ jQuery.Animation = jQuery.extend( Animation, {
234234
});
235235

236236
function defaultPrefilter( elem, props, opts ) {
237-
var index, prop, value, length, dataShow, tween, hooks, oldfire,
237+
var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
238238
anim = this,
239239
style = elem.style,
240240
orig = {},
@@ -308,6 +308,7 @@ function defaultPrefilter( elem, props, opts ) {
308308
value = props[ index ];
309309
if ( rfxtypes.exec( value ) ) {
310310
delete props[ index ];
311+
toggle = toggle || value === "toggle";
311312
if ( value === ( hidden ? "hide" : "show" ) ) {
312313
continue;
313314
}
@@ -318,6 +319,14 @@ function defaultPrefilter( elem, props, opts ) {
318319
length = handled.length;
319320
if ( length ) {
320321
dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
322+
if ( "hidden" in dataShow ) {
323+
hidden = dataShow.hidden;
324+
}
325+
326+
// store state if its toggle - enables .stop().toggle() to "reverse"
327+
if ( toggle ) {
328+
dataShow.hidden = !hidden;
329+
}
321330
if ( hidden ) {
322331
jQuery( elem ).show();
323332
} else {

test/unit/effects.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,4 +1858,48 @@ test( "Animations with 0 duration don't ease (#12273)", 1, function() {
18581858
delete jQuery.easing.test;
18591859
});
18601860

1861+
jQuery.map([ "toggle", "slideToggle", "fadeToggle" ], function ( method ) {
1862+
// this test would look a lot better if we were using something to override
1863+
// the default timers
1864+
asyncTest( "toggle state tests: " + method + " (#8685)", function() {
1865+
function secondToggle() {
1866+
var stopped = parseFloat( element.css( check ) );
1867+
tested = false;
1868+
element[ method ]({
1869+
duration: 5000,
1870+
step: function( p, fx ) {
1871+
if ( fx.pos > 0.1 && fx.prop === check && !tested ) {
1872+
tested = true;
1873+
equal( fx.start, stopped, check + " starts at " + stopped + " where it stopped" );
1874+
equal( fx.end, original, check + " ending value is " + original );
1875+
element.stop();
1876+
}
1877+
},
1878+
always: start
1879+
});
1880+
}
1881+
1882+
var tested,
1883+
original,
1884+
check = method === "slideToggle" ? "height" : "opacity",
1885+
element = jQuery( "#foo" );
1886+
1887+
expect( 4 );
1888+
1889+
element[ method ]({
1890+
duration: 5000,
1891+
step: function( p, fx ) {
1892+
if ( fx.pos > 0.1 && fx.prop === check && !tested ) {
1893+
tested = true;
1894+
original = fx.start;
1895+
equal( fx.start !== 0, true, check + " is starting at " + original + " on first toggle" );
1896+
equal( fx.end, 0, check + " is ending at 0 on first toggle" );
1897+
element.stop();
1898+
}
1899+
},
1900+
always: secondToggle
1901+
});
1902+
});
1903+
});
1904+
18611905
} // if ( jQuery.fx )

0 commit comments

Comments
 (0)