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:
parent
7f1eb1c14f
commit
848c45ea17
2 changed files with 22 additions and 17 deletions
20
src/core.js
20
src/core.js
|
@ -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 );
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue