jQuery outerHeight()Bug - 在ver下面不能正常工作。 1.8.3

时间:2013-01-31 21:25:35

标签: jquery height outerheight

所以我有一个脚本可以平衡其x轴上其他元素的高度。该脚本运行良好...但只有当我使用jQuery 1.8.3+时。问题似乎是由outerHeight()函数引起的。

我试图找出1.8.3+对outerHeight()进行了哪些更新,但我没有太多运气。

请参阅此fiddle,其中一切都可以正常使用jQuery 1.8.3。

这个fiddle使用jQuery 1.7.2脚本中断。

任何人都可以帮助解释问题发生的原因,并希望解决我的困境! (理想情况下,我需要这个适用于jQuery 1.7.1 +)

为了更清楚地说明为什么我要使用outerHeight(),当其中一个选择器在顶部/底部height()上有边距或填充时,将无法完成。看看我的意思> http://jsfiddle.net

谢谢!

1 个答案:

答案 0 :(得分:1)

为了解决需要在尚未支持它的jQuery版本中向outerHeight()添加setter的问题,我只添加了following helper提供的jQuery++

var weird = /button|select/i, //margin is inside border
getBoxes = {},
    checks = {
        width: ["Left", "Right"],
        height: ['Top', 'Bottom'],
        oldOuterHeight: $.fn.outerHeight,
        oldOuterWidth: $.fn.outerWidth,
        oldInnerWidth: $.fn.innerWidth,
        oldInnerHeight: $.fn.innerHeight
    };
/**
* @add jQuery.fn
*/
$.each({

/**
* @function outerWidth
* @parent dimensions
* Lets you set the outer width on an object
* @param {Number} [height]
* @param {Boolean} [includeMargin=false] Makes setting the outerWidth adjust
* for margin. Defaults to false.
*
* $('#hasMargin').outerWidth(50, true);
*
* @return {jQuery|Number} If you are setting the value, returns the jQuery wrapped elements.
*/
width:
/**
* @function innerWidth
* @parent dimensions
* Lets you set the inner height of an object
* @param {Number} [height]
*/
"Width",
/**
* @function outerHeight
* @parent dimensions
* Lets you set the outer height of an object where: <br/>
* <code>outerHeight = height + padding + border + (margin)</code>.
* @codestart
* $("#foo").outerHeight(100); //sets outer height
* $("#foo").outerHeight(100, true); //uses margins
* $("#foo").outerHeight(); //returns outer height
* $("#foo").outerHeight(true); //returns outer height with margins
* @codeend
* When setting the outerHeight, it adjusts the height of the element.
* @param {Number|Boolean} [height] If a number is provided -> sets the outer height of the object.<br/>
* If true is given -> returns the outer height and includes margins.<br/>
* If no value is given -> returns the outer height without margin.
* @param {Boolean} [includeMargin] Makes setting the outerHeight adjust for margin.
* @return {jQuery|Number} If you are setting the value, returns the jQuery wrapped elements.
* Otherwise, returns outerHeight in pixels.
*/
height:
/**
* @function innerHeight
* @parent dimensions
* Lets you set the outer width on an object
* @param {Number} [height]
*/
"Height" }, function(lower, Upper) {

    //used to get the padding and border for an element in a given direction
    getBoxes[lower] = function(el, boxes) {
        var val = 0;
        if (!weird.test(el.nodeName)) {
            //make what to check for ....
            var myChecks = [];
            $.each(checks[lower], function() {
                var direction = this;
                $.each(boxes, function(name, val) {
                    if (val)
                        myChecks.push(name + direction+ (name == 'border' ? "Width" : "") );
                })
            })
            $.each($.curStyles(el, myChecks), function(name, value) {
                val += (parseFloat(value) || 0);
            })
        }
        return val;
    }

    //getter / setter
    $.fn["outer" + Upper] = function(v, margin) {
        var first = this[0];
if (typeof v == 'number') {
            first && this[lower](v - getBoxes[lower](first, {padding: true, border: true, margin: margin}))
            return this;
        } else {
            return first ? checks["oldOuter" + Upper].call(this, v) : null;
        }
    }
    $.fn["inner" + Upper] = function(v) {
        var first = this[0];
if (typeof v == 'number') {
            first&& this[lower](v - getBoxes[lower](first, { padding: true }))
            return this;
        } else {
            return first ? checks["oldInner" + Upper].call(this, v) : null;
        }
    }
    //provides animations
var animate = function(boxes){
return function(fx){
if (fx.state == 0) {
fx.start = $(fx.elem)[lower]();
fx.end = fx.end - getBoxes[lower](fx.elem,boxes);
}
fx.elem.style[lower] = (fx.pos * (fx.end - fx.start) + fx.start) + "px"
}
}
    $.fx.step["outer" + Upper] = animate({padding: true, border: true})

$.fx.step["outer" + Upper+"Margin"] = animate({padding: true, border: true, margin: true})

$.fx.step["inner" + Upper] = animate({padding: true})

})

非常满意这个发现!希望它可以帮助别人。干杯!