jquery fx: sync animations were being left on jQuery.timers (double callback)

jQuery.timerId is now a local var and it's not null'ed anymore.
This commit is contained in:
Ariel Flesler 2009-01-14 23:09:52 +00:00
parent f649acd8ab
commit 34a9f8a210
2 changed files with 39 additions and 10 deletions

View file

@ -1,4 +1,5 @@
var elemdisplay = {}, var elemdisplay = {},
timerId,
fxAttrs = [ fxAttrs = [
// height animations // height animations
[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
@ -221,7 +222,6 @@ jQuery.extend({
}, },
timers: [], timers: [],
timerId: null,
fx: function( elem, options, prop ){ fx: function( elem, options, prop ){
this.options = options; this.options = options;
@ -273,10 +273,8 @@ jQuery.fx.prototype = {
t.elem = this.elem; t.elem = this.elem;
jQuery.timers.push(t); if ( t() && jQuery.timers.push(t) == 1 ) {
timerId = setInterval(function(){
if ( t() && jQuery.timerId == null ) {
jQuery.timerId = setInterval(function(){
var timers = jQuery.timers; var timers = jQuery.timers;
for ( var i = 0; i < timers.length; i++ ) for ( var i = 0; i < timers.length; i++ )
@ -284,8 +282,7 @@ jQuery.fx.prototype = {
timers.splice(i--, 1); timers.splice(i--, 1);
if ( !timers.length ) { if ( !timers.length ) {
clearInterval( jQuery.timerId ); clearInterval( timerId );
jQuery.timerId = null;
} }
}, 13); }, 13);
} }
@ -351,11 +348,10 @@ jQuery.fx.prototype = {
if ( this.options.hide || this.options.show ) if ( this.options.hide || this.options.show )
for ( var p in this.options.curAnim ) for ( var p in this.options.curAnim )
jQuery.attr(this.elem.style, p, this.options.orig[p]); jQuery.attr(this.elem.style, p, this.options.orig[p]);
}
if ( done )
// Execute the complete function // Execute the complete function
this.options.complete.call( this.elem ); this.options.complete.call( this.elem );
}
return false; return false;
} else { } else {

View file

@ -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(){ test("animate non-element", function(){
expect(1); expect(1);
stop(); stop();