FX Queueing added. Effects no longer mess up causing weird results.
authorJohn Resig <jeresig@gmail.com>
Thu, 15 Jun 2006 04:48:52 +0000 (04:48 +0000)
committerJohn Resig <jeresig@gmail.com>
Thu, 15 Jun 2006 04:48:52 +0000 (04:48 +0000)
fx/fx.js
jquery/jquery.js

index 787f3da..665f895 100644 (file)
--- a/fx/fx.js
+++ b/fx/fx.js
@@ -3,54 +3,108 @@ $.speed = function(s,o) {
        o = o || {};
        var ss = {"crawl":1200,"xslow":850,"slow":600,"medium":400,"fast":200,"xfast":75,"normal":400};
        o.duration = typeof s == "number" ? s : ss[s] || 400;
+
+       o.oldComplete = o.onComplete;
+       o.onComplete = function(){
+               $.dequeue(this, 'fx');
+               if ( o.oldComplete && o.oldComplete.constructor == Function ) {
+                       $.apply( this, o.oldComplete );
+               }
+       };
+
        return o;
 };
 
+$.queue = {};
+
+$.dequeue = function(elem,type){
+       type = type || 'fx';
+
+       if ( elem.$$queue && elem.$$queue[type] ) {
+               // Remove self
+               elem.$$queue[type].shift();
+
+               // Get next function
+               var f = elem.$$queue[type][0];
+       
+               if ( f ) {
+                       $.apply( elem, f );
+               }
+       }
+};
+
+$.fn.queue = function(type,fn){
+       if ( !fn ) {
+               fn = type;
+               type = 'fx';
+       }
+
+       return this.each(function(){
+               if ( !this.$$queue ) {
+                       this.$$queue = {};
+               }
+
+               if ( !this.$$queue[type] ) {
+                       this.$$queue[type] = [];
+               }
+
+               this.$$queue[type].push( fn );
+       
+               if ( this.$$queue[type].length == 1 ) {
+                       $.apply(this,fn);
+               }
+       });
+};
+
+$.fn._hide = $.fn.hide;
+
 $.fn.hide = function(a,o) {
        o = $.speed(a,o);
-       return a ? this.each(function(){
+       return a ? this.queue(function(){
                new $.fx.FadeSize(this,o).hide();
        }) : this._hide();
 };
 
+$.fn._show = $.fn.show;
+
 $.fn.show = function(a,o) {
        o = $.speed(a,o);
-       return a ? this.each(function(){
+       return a ? this.queue(function(){
                new $.fx.FadeSize(this,o).show();
        }) : this._show();
 };
 
 $.fn.slideDown = function(a,o) {
        o = $.speed(a,o);
-       return this.each(function(){
+       return this.queue(function(){
                new $.fx.Resize(this,o).show("height");
        });
 };
 
 $.fn.slideUp = function(a,o) {
        o = $.speed(a,o);
-       return this.each(function(){
+       return this.queue(function(){
                new $.fx.Resize(this,o).hide("height");
        });
 };
 
 $.fn.fadeOut = function(a,o) {
        o = $.speed(a,o);
-       return a ? this.each(function(){
+       return a ? this.queue(function(){
                new $.fx.Opacity(this,o,1).hide();
        }) : this._hide();
 };
 
 $.fn.fadeIn = function(a,o) {
        o = $.speed(a,o);
-       return a ? this.each(function(){
+       return a ? this.queue(function(){
                new $.fx.Opacity(this,o,1).show();
        }) : this._show();
 };
 
 $.fn.fadeTo = function(a,ev,o) {
        o = $.speed(a,o);
-       return a ? this.each(function(){
+       return a ? this.queue(function(){
                ef = new $.fx.Opacity(this,o);
                ef.custom(ef.cur(),parseFloat(ev));
                ef.show();
@@ -172,24 +226,29 @@ $.fx = function(el,op,ty){
                        clearInterval(z.timer);
                        z.timer = null;
 
+                       z.now = lastNum;
+                       z.a();
+
                        // Reset the overflow
                        y.overflow = z.oldOverflow;
 
-                       // If the element is, effectively, hidden - hide it
-                       if( y.height == "0px" || y.width == "0px" ) {
-                               y.display = "none";
-                       }
-
                        // If the element was shown, and not using a custom number,
-                       // set its height and width to auto
-                       if ( ty != "opacity" && z.o.auto ) {
-                               $.setAuto( z.el, 'height' );
-                               $.setAuto( z.el, 'width' );
+                       // set its height and/or width to auto
+                       if ( (ty == "height" || ty == "width") && z.o.auto ) {
+                               $.setAuto( z.el, ty );
                        }
 
                        // If a callback was provided, execute it
                        if( z.o.onComplete.constructor == Function ) {
-                               $.apply( z.el, z.onComplete );
+
+                               // Yes, this is a weird place for this, but it needs to be executed
+                               // only once per cluster of effects.
+                               // If the element is, effectively, hidden - hide it
+                               if ( y.height == "0px" || y.width == "0px" ) {
+                                       y.display = "none";
+                               }
+
+                               $.apply( z.el, z.o.onComplete );
                        }
                } else {
                        // Figure out where in the animation we are and set the number
index 75dd907..fe42cac 100644 (file)
@@ -365,7 +365,7 @@ $.getCSS = function(e,p) {
                        els.visibility = 'hidden';
                        els.position = 'absolute';
                        els.display = '';
-                       oHeight = e.clientHeight - ph || parseInt(e.style.height,10);
+                       oHeight = e.clientHeight || parseInt(e.style.height,10);
                        oWidth = e.clientWidth || parseInt(e.style.width,10);
                        els.display = od;
                        els.position = op;
@@ -398,7 +398,6 @@ $.clean = function(a) {
        for ( var i = 0; i < a.length; i++ ) {
                if ( a[i].constructor == String ) {
                        if ( a[i].indexOf("<tr") == 0 ) {
-//alert("tr");
                                var tr = true;
                                a[i] = "<table>" + a[i] + "</table>";
                        }