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:
parent
f649acd8ab
commit
34a9f8a210
14
src/fx.js
14
src/fx.js
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue