在jQuery中,当元素不可见时,width()返回0.这是有道理的,但我需要获得表的宽度,以便在显示父表之前设置父表的宽度.

如下所示,父级中有文本,这使得父级歪斜并且看起来很难看.我希望父级仅与桌子一样宽,并使文本换行.

<div id="parent">
    Text here ... Can get very long and skew the parent
    <table> ... </table>
    Text here too ... which is why I want to shrink the parent based on the table
</div>

CSS:

#parent
{
    display: none;
}

Javascript:

var tableWidth = $('#parent').children('table').outerWidth();
if (tableWidth > $('#parent').width())
{
    $('#parent').width(tableWidth);
}

tableWidth总是返回0,因为它不可见(这是我的猜测,因为它在可见时给我一个数字).有没有办法在不让父对象可见的情况下获得表的宽度?

推荐答案

Here is a trick I have used. It involves adding some CSS properties to make jQuery think the element is visible, but in fact it is still hidden.

var $table = $("#parent").children("table");
$table.css({ position: "absolute", visibility: "hidden", display: "block" });
var tableWidth = $table.outerWidth();
$table.css({ position: "", visibility: "", display: "" });

这是一种黑客行为,但对我来说似乎很好.

UPDATE

从那以后,我写了一篇blog post页的文章来讨论这个话题.由于要将CSS属性重置为空值,上述方法可能会出现问题.如果他们以前有价值观呢?更新后的解决方案使用jQuery源代码中的swap()方法.

Code from referenced blog post:

//Optional parameter includeMargin is used when calculating outer dimensions  
(function ($) {
$.fn.getHiddenDimensions = function (includeMargin) {
    var $item = this,
    props = { position: 'absolute', visibility: 'hidden', display: 'block' },
    dim = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 },
    $hiddenParents = $item.parents().andSelf().not(':visible'),
    includeMargin = (includeMargin == null) ? false : includeMargin;

    var oldProps = [];
    $hiddenParents.each(function () {
        var old = {};

        for (var name in props) {
            old[name] = this.style[name];
            this.style[name] = props[name];
        }

        oldProps.push(old);
    });

    dim.width = $item.width();
    dim.outerWidth = $item.outerWidth(includeMargin);
    dim.innerWidth = $item.innerWidth();
    dim.height = $item.height();
    dim.innerHeight = $item.innerHeight();
    dim.outerHeight = $item.outerHeight(includeMargin);

    $hiddenParents.each(function (i) {
        var old = oldProps[i];
        for (var name in props) {
            this.style[name] = old[name];
        }
    });

    return dim;
}
}(jQuery));

Jquery相关问答推荐

:eq Jquery,我似乎无法显示第一个之后的元素

使用jquery将外部代码插入div

在 Bootstrap 3 中向工具提示添加换行符

如何使用 jQuery 获取所有 ID?

在 `click` 和 `enter` 上触发事件

如何在循环内创建动态变量名称?

使用 jQuery 发送 JSON 数据

确定 JavaScript 值是否为整数?

按值对 Html Select 的选项进行排序的最有效方法是什么,同时保留当前选定的项目?

通过 AJAX 和 jQuery 使用 HTML5 文件上传

如何使用 jquery 动态更改 iframe 中的内容?

C# String.IsNullOrEmpty Javascript 等效项

触发下拉更改事件

我如何知道 jQuery 是否有待处理的 Ajax 请求?

测试空 jQuery Select 结果

如何删除/更改 JQuery UI 自动完成助手文本?

jQuery ajax 成功回调函数定义

如何使用 javascript 擦除所有内联样式并仅保留 css 样式表中指定的样式?

将多个 JavaScript 文件合并为一个 JS 文件

$(document).click() 在 iPhone 上无法正常工作. jQuery