Skip to content
Permalink
Browse files

jquery fx: sync animations were being left on jQuery.timers (double c…

…allback)

           jQuery.timerId is now a local var and it's not null'ed anymore.
  • Loading branch information
flesler committed Jan 14, 2009
1 parent f649acd commit 34a9f8a210cfa0aabccc40a974646127d1871d1a
Showing with 39 additions and 10 deletions.
  1. +6 −10 src/fx.js
  2. +33 −0 test/unit/fx.js
@@ -1,4 +1,5 @@
var elemdisplay = {},
timerId,
fxAttrs = [
// height animations
[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
@@ -221,7 +222,6 @@ jQuery.extend({
},

timers: [],
timerId: null,

fx: function( elem, options, prop ){
this.options = options;
@@ -273,19 +273,16 @@ jQuery.fx.prototype = {

t.elem = this.elem;

jQuery.timers.push(t);

if ( t() && jQuery.timerId == null ) {
jQuery.timerId = setInterval(function(){
if ( t() && jQuery.timers.push(t) == 1 ) {
timerId = setInterval(function(){
var timers = jQuery.timers;

for ( var i = 0; i < timers.length; i++ )
if ( !timers[i]() )
timers.splice(i--, 1);

if ( !timers.length ) {
clearInterval( jQuery.timerId );
jQuery.timerId = null;
clearInterval( timerId );
}
}, 13);
}
@@ -351,11 +348,10 @@ jQuery.fx.prototype = {
if ( this.options.hide || this.options.show )
for ( var p in this.options.curAnim )
jQuery.attr(this.elem.style, p, this.options.orig[p]);
}

if ( done )

// Execute the complete function
this.options.complete.call( this.elem );
}

return false;
} else {
@@ -34,6 +34,39 @@ test("animate option (queue === false)", function () {
});
});

test("animate duration 0", function() {
expect(5);

stop();

var $elems = jQuery([{ a:0 },{ a:0 }]),
counter = 0,
count = function(){
counter++;
};

equals( jQuery.timers.length, 0, "Make sure no animation was running from another test" );

$elems.eq(0).animate( {a:1}, 0, count );

// Failed until [6115]
equals( jQuery.timers.length, 0, "Make sure synchronic animations are not left on jQuery.timers" );

equals( counter, 1, "One synchronic animations" );

$elems.animate( { a:2 }, 0, count );

equals( counter, 3, "Multiple synchronic animations" );

$elems.eq(0).animate( {a:3}, 0, count );
$elems.eq(1).animate( {a:3}, 20, function(){
count();
// Failed until [6115]
equals( counter, 5, "One synchronic and one asynchronic" );
start();
});
});

test("animate non-element", function(){
expect(1);
stop();

0 comments on commit 34a9f8a

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