diff options
author | louisremi <louisremi@louisremi-laptop.(none)> | 2011-04-15 14:44:55 +0200 |
---|---|---|
committer | louisremi <louisremi@louisremi-laptop.(none)> | 2011-04-15 14:44:55 +0200 |
commit | eccf15be6cfee8b567785ba29cc8841b1b0c2ef1 (patch) | |
tree | 6b09ee23caabfd8bffb903d95db26bea751723ea /src | |
parent | 7dc707042692398392bd910b01f3a6aab81a90a0 (diff) | |
parent | 8e1467f97eb8facb6677663794eb159eb8fedaab (diff) | |
download | jquery-eccf15be6cfee8b567785ba29cc8841b1b0c2ef1.tar.gz jquery-eccf15be6cfee8b567785ba29cc8841b1b0c2ef1.zip |
- merge master
- move private functions at the bottom
- remove duplicate code
- move more var at the top of their scope
- rewrite a loop to be more efficient
Diffstat (limited to 'src')
-rw-r--r-- | src/css.js | 46 | ||||
-rw-r--r-- | src/effects.js | 137 |
2 files changed, 116 insertions, 67 deletions
diff --git a/src/css.js b/src/css.js index c5c01ecac..9db659967 100644 --- a/src/css.js +++ b/src/css.js @@ -9,6 +9,7 @@ var ralpha = /alpha\([^)]*\)/i, rnum = /^-?\d/, rrelNum = /^[+\-]=/, rrelNumFilter = /[^+\-\.\de]+/g, + rinputbutton = /input|button/i, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssWidth = [ "Left", "Right" ], @@ -338,24 +339,45 @@ curCSS = getComputedStyle || currentStyle; function getWH( elem, name, extra ) { var which = name === "width" ? cssWidth : cssHeight, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight; + cur = curCSS( elem, name ), + + // We're addressing the way Firefox handles certain inputs and buttons, + // offsetWidth/height actually returns a normal width/height + boxSizing = rinputbutton.test( elem.nodeName ) && + ( curCSS( elem, "-moz-box-sizing" ) === "border-box" || + curCSS( elem, "box-sizing" ) === "border-box" ); + + // IE will return auto if we try to grab a width/height that is not set + if ( boxSizing || cur === "auto" ) { + cur = name === "width" ? elem.offsetWidth : elem.offsetHeight; + } - if ( extra === "border" ) { - return val; + // Make sure that IE7 returns the correct computed value for display + if ( name === "height" ) { + elem.offsetHeight; } + + var val = parseFloat( cur ) || 0; - jQuery.each( which, function() { - if ( !extra ) { - val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0; - } + if ( extra ) { + for ( var i = 0, len = which.length; i < len ; i++ ) { + var dir = which[i]; - if ( extra === "margin" ) { - val += parseFloat(jQuery.css( elem, "margin" + this )) || 0; + // outerWidth/height + if ( extra === "border" || extra === "margin" ) { + val += parseFloat(jQuery.css( elem, "border" + dir + "Width" )) || 0; + val += parseFloat(jQuery.css( elem, "padding" + dir )) || 0; - } else { - val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0; + if ( extra == "margin" ) { + val += parseFloat(jQuery.css( elem, "margin" + dir )) || 0; + } + + // innerWidth/height + } else { + val += parseFloat(jQuery.css( elem, "padding" + dir )) || 0; + } } - }); + } return val; } diff --git a/src/effects.js b/src/effects.js index d19f8f61f..80391d89c 100644 --- a/src/effects.js +++ b/src/effects.js @@ -1,6 +1,8 @@ (function( jQuery ) { var elemdisplay = {}, + iframe = null, + iframeDoc = null, rfxtypes = /^(?:toggle|show|hide)$/, rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, timerId, @@ -17,46 +19,6 @@ var elemdisplay = {}, window.mozRequestAnimationFrame || window.oRequestAnimationFrame; -// Animations created synchronously will run synchronously -function createFxNow() { - setTimeout( clearFxNow, 0 ); - return ( fxNow = jQuery.now() ); -} - -function clearFxNow() { - fxNow = undefined; -} - -// Try to restore the default display value of an element -// fails if a display rule has been set for this element, e.g. div { display: inline; } -function defaultDisplay( nodeName ) { - if ( !elemdisplay[ nodeName ] ) { - var elem = jQuery("<" + nodeName + ">").appendTo("body"), - display = elem.css("display"); - - elem.remove(); - - if ( display === "none" || display === "" ) { - display = "block"; - } - - elemdisplay[ nodeName ] = display; - } - - return elemdisplay[ nodeName ]; -} - -// Generate parameters to create a standard animation -function genFx( type, num ) { - var obj = {}; - - jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { - obj[ this ] = type; - }); - - return obj; -} - jQuery.fn.extend({ show: function( speed, easing, callback ) { var elem, display; @@ -166,7 +128,6 @@ jQuery.fn.extend({ var opt = jQuery.extend({}, optall), isElement = this.nodeType === 1, hidden = isElement && jQuery(this).is(":hidden"), - self = this, name, val, p, easing, display, e, parts, start, end, unit; @@ -187,10 +148,6 @@ jQuery.fn.extend({ val = prop[p]; if ( val === "hide" && hidden || val === "show" && !hidden ) { - return opt.complete.call(self); - } - - if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { return opt.complete.call(this); } @@ -240,7 +197,7 @@ jQuery.fn.extend({ } for ( p in prop ) { - e = new jQuery.fx( self, opt, p ); + e = new jQuery.fx( this, opt, p ); val = prop[p]; @@ -257,9 +214,9 @@ jQuery.fn.extend({ // We need to compute starting value if ( unit !== "px" ) { - jQuery.style( self, p, (end || 1) + unit); + jQuery.style( this, p, (end || 1) + unit); start = ((end || 1) / e.cur()) * start; - jQuery.style( self, p, start + unit); + jQuery.style( this, p, start + unit); } // If a +=/-= token was provided, we're doing a relative animation @@ -470,7 +427,8 @@ jQuery.fx.prototype = { var t = fxNow || createFxNow(), done = true, elem = this.elem, - options = this.options; + options = this.options, + i, n; if ( gotoEnd || t >= options.duration + this.startTime ) { this.now = this.end; @@ -479,7 +437,7 @@ jQuery.fx.prototype = { options.animatedProperties[ this.prop ] = true; - for ( var i in options.animatedProperties ) { + for ( i in options.animatedProperties ) { if ( options.animatedProperties[i] !== true ) { done = false; } @@ -517,7 +475,7 @@ jQuery.fx.prototype = { if ( options.duration == Infinity ) { this.now = t; } else { - var n = t - this.startTime; + n = t - this.startTime; this.state = n / options.duration; // Perform the easing function, defaults to swing @@ -534,11 +492,11 @@ jQuery.fx.prototype = { jQuery.extend( jQuery.fx, { tick: function() { - var timers = jQuery.timers; - - for ( var i = 0; i < timers.length; i++ ) { + var timers = jQuery.timers, + i = timers.length; + while ( i-- ) { if ( !timers[i]() ) { - timers.splice(i--, 1); + timers.splice(i, 1); } } @@ -584,4 +542,73 @@ if ( jQuery.expr && jQuery.expr.filters ) { }; } +// Try to restore the default display value of an element +function defaultDisplay( nodeName ) { + + if ( !elemdisplay[ nodeName ] ) { + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( "body" ), + display = elem.css( "display" ); + + elem.remove(); + + if ( display === "none" || display === "" ) { + + // Get element's real default display by attaching it to a temp iframe + // Conritbutions from Louis Remi and Julian Aurbourg + // based on recommendation by Louis Remi + + // No iframe to use yet, so create it + if ( !iframe ) { + iframe = document.createElement( "iframe" ); + iframe.frameBorder = iframe.width = iframe.height = 0; + } + + document.body.appendChild( iframe ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html + // document to it, Webkit & Firefox won't allow reusing the iframe document + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write( "<!doctype><html><body></body></html>" ); + } + + elem = iframeDoc.createElement( nodeName ); + + iframeDoc.body.appendChild( elem ); + + display = jQuery.css( elem, "display" ); + + document.body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return elemdisplay[ nodeName ]; +} + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout( clearFxNow, 0 ); + return ( fxNow = jQuery.now() ); +} + +function clearFxNow() { + fxNow = undefined; +} + +// Generate parameters to create a standard animation +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} + })( jQuery ); |