Bug Tracker

Ticket #6281: jquery.fx.slot.patch

File jquery.fx.slot.patch, 4.3 KB (added by AzaToth, 10 years ago)
  • src/effects.js

    diff --git a/src/effects.js b/src/effects.js
    index 97456cc..3a02656 100644
    a b jQuery.fn.extend({ 
    105105                                        .animate({opacity: to}, speed, callback);
    106106        },
    107107
    108         animate: function( prop, speed, easing, callback ) {
    109                 var optall = jQuery.speed(speed, easing, callback);
     108        animate: function( prop, speed, easing, callback, slot ) {
     109                var optall = jQuery.speed(speed, easing, callback, slot);
    110110
    111111                if ( jQuery.isEmptyObject( prop ) ) {
    112112                        return this.each( optall.complete );
    jQuery.fn.extend({ 
    177177                                                        end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
    178178                                                }
    179179
    180                                                 e.custom( start, end, unit );
     180                                                e.custom( start, end, unit, optall.slot );
    181181
    182182                                        } else {
    183                                                 e.custom( start, val, "" );
     183                                                e.custom( start, val, "", optall.slot );
    184184                                        }
    185185                                }
    186186                        });
    jQuery.fn.extend({ 
    198198                }
    199199
    200200                this.each(function() {
     201               
    201202                        // go in reverse order so anything added to the queue during the loop is ignored
    202203                        for ( var i = timers.length - 1; i >= 0; i-- ) {
    203                                 if ( timers[i].elem === this ) {
    204                                         if (gotoEnd) {
    205                                                 // force the next step to be the last
    206                                                 timers[i](true);
     204                                var slot = timers[i];
     205                                for ( var j = slot.childs.length - 1; j >= 0; j-- ) {
     206                                        if ( slot.childs[j].elem === this ) {
     207                                                if (gotoEnd) {
     208                                                        // force the next step to be the last
     209                                                        slot.childs[j](true);
     210                                                }
     211                                                slot.childs.splice(j, 1);
    207212                                        }
    208 
     213                                }
     214                                if ( !slot.childs.length  ) {
    209215                                        timers.splice(i, 1);
    210216                                }
     217
    211218                        }
    212219                });
    213220
    jQuery.each({ 
    245252});
    246253
    247254jQuery.extend({
    248         speed: function( speed, easing, fn ) {
     255        speed: function( speed, easing, fn, slot ) {
    249256                var opt = speed && typeof speed === "object" ? speed : {
    250257                        complete: fn || !fn && easing ||
    251258                                jQuery.isFunction( speed ) && speed,
    jQuery.extend({ 
    256263                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
    257264                        jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
    258265
     266                opt.slot = slot || new jQuery.slot();
    259267                // Queueing
    260268                opt.old = opt.complete;
    261269                opt.complete = function() {
    jQuery.extend({ 
    281289
    282290        timers: [],
    283291
     292        slot: function(time) {
     293                this.childs = [];
     294                this.time = time || now();
     295                this.added = false;
     296        },
     297
    284298        fx: function( elem, options, prop ) {
    285299                this.options = options;
    286300                this.elem = elem;
    jQuery.fx.prototype = { 
    319333        },
    320334
    321335        // Start an animation from one number to another
    322         custom: function( from, to, unit ) {
    323                 this.startTime = now();
     336        custom: function( from, to, unit, slot ) {
     337                this.startTime = slot.time;
    324338                this.start = from;
    325339                this.end = to;
    326340                this.unit = unit || this.unit || "px";
    jQuery.fx.prototype = { 
    329343
    330344                var self = this;
    331345                function t( gotoEnd ) {
    332                         return self.step(gotoEnd);
     346                        return self.step(gotoEnd, slot);
    333347                }
    334348
    335349                t.elem = this.elem;
    336350
    337                 if ( t() && jQuery.timers.push(t) && !timerId ) {
    338                         timerId = setInterval(jQuery.fx.tick, 13);
     351                if( t() ) {
     352                        slot.childs.push( t );
     353                        if( !slot.added ) {
     354                                jQuery.timers.push( slot );
     355                                slot.added = true;
     356                        }
     357                        if( ! timerId ) {
     358                                timerId = setInterval(jQuery.fx.tick, 13);
     359                        }
    339360                }
    340361        },
    341362
    jQuery.fx.prototype = { 
    365386        },
    366387
    367388        // Each step of an animation
    368         step: function( gotoEnd ) {
    369                 var t = now(), done = true;
     389        step: function( gotoEnd, slot ) {
     390                var t = slot.time, done = true;
    370391
    371392                if ( gotoEnd || t >= this.options.duration + this.startTime ) {
    372393                        this.now = this.end;
    jQuery.extend( jQuery.fx, { 
    436457                var timers = jQuery.timers;
    437458
    438459                for ( var i = 0; i < timers.length; i++ ) {
    439                         if ( !timers[i]() ) {
     460                        var slot = timers[i];
     461                        for ( var j = 0; j < slot.childs.length; j++ ) {
     462                                if ( !slot.childs[j]() ) {
     463                                        slot.childs.splice(j--, 1);
     464                                }
     465                        }
     466                        slot.time = now();
     467                        if ( !slot.childs.length  ) {
    440468                                timers.splice(i--, 1);
    441469                        }
     470
    442471                }
    443472
    444473                if ( !timers.length ) {
    jQuery.extend( jQuery.fx, { 
    475504
    476505if ( jQuery.expr && jQuery.expr.filters ) {
    477506        jQuery.expr.filters.animated = function( elem ) {
    478                 return jQuery.grep(jQuery.timers, function( fn ) {
    479                         return elem === fn.elem;
    480                 }).length;
     507                return jQuery.grep(jQuery.timers, function( slot ) {
     508                                return jQuery.grep(slot.childs, function( fn ) {
     509                                                return elem === fn.elem;
     510                                        }).length;
     511                        }).length;
    481512        };
    482513}