Added some significant speed-ups to height/width checks, thanks to some code and investigation by Mike Helgeson. Fixes #3082.

This commit is contained in:
John Resig 2009-02-13 22:58:57 +00:00
parent 7f1eb1c14f
commit 848c45ea17
2 changed files with 22 additions and 17 deletions

View file

@ -734,26 +734,32 @@ jQuery.extend({
elem.style[ name ] = old[ name ]; elem.style[ name ] = old[ name ];
}, },
css: function( elem, name, force ) { css: function( elem, name, force, extra ) {
if ( name == "width" || name == "height" ) { if ( name == "width" || name == "height" ) {
var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
function getWH() { function getWH() {
val = name == "width" ? elem.offsetWidth : elem.offsetHeight; val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
var padding = 0, border = 0;
if ( extra === "border" )
return;
jQuery.each( which, function() { jQuery.each( which, function() {
padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; if ( !extra )
border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
if ( extra === "margin" )
val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
else
val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
}); });
val -= Math.round(padding + border);
} }
if ( jQuery(elem).is(":visible") ) if ( elem.offsetWidth !== 0 )
getWH(); getWH();
else else
jQuery.swap( elem, props, getWH ); jQuery.swap( elem, props, getWH );
return Math.max(0, val); return Math.max(0, Math.round(val));
} }
return jQuery.curCSS( elem, name, force ); return jQuery.curCSS( elem, name, force );

View file

@ -2,22 +2,21 @@
jQuery.each([ "Height", "Width" ], function(i, name){ jQuery.each([ "Height", "Width" ], function(i, name){
var tl = i ? "Left" : "Top", // top or left var tl = i ? "Left" : "Top", // top or left
br = i ? "Right" : "Bottom"; // bottom or right br = i ? "Right" : "Bottom", // bottom or right
lower = name.toLowerCase();
// innerHeight and innerWidth // innerHeight and innerWidth
jQuery.fn["inner" + name] = function(){ jQuery.fn["inner" + name] = function(){
return this[ name.toLowerCase() ]() + return this[0] ?
num(this, "padding" + tl) + jQuery.css( this[0], lower, false, "padding" ) :
num(this, "padding" + br); null;
}; };
// outerHeight and outerWidth // outerHeight and outerWidth
jQuery.fn["outer" + name] = function(margin) { jQuery.fn["outer" + name] = function(margin) {
return this["inner" + name]() + return this[0] ?
num(this, "border" + tl + "Width") + jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
num(this, "border" + br + "Width") + null;
(margin ?
num(this, "margin" + tl) + num(this, "margin" + br) : 0);
}; };
var type = name.toLowerCase(); var type = name.toLowerCase();