打开对话框后,JQuery对话框的条件调整大小为内容高度

Conditional resizing of JQuery dialog to content height after opening the dialog

本文关键字:小为 高度 调整 条件 JQuery 对话框 打开对话框      更新时间:2023-09-26

早上大部分时间我都在看SO,但没有发现任何帮助。

目标

我试图在JQuery对话框中复制maxHeight选项的行为。此选项仅在调整对话框大小后适用,我希望此属性在打开对话框时应用,而不是在调整大小时应用。

除非发布新版本的补丁,否则我能做的最好的事情就是变通。

我的项目信息

C#中的ASP.NET 3.5

详细信息

我必须打开一个包含gridview的对话框(在对话框使用的div中),在该对话框中,正常使用可以显示从1或2行到几十行的任何内容。

  1. 我在SO上找到了一个解决方案,它意味着在我的div上设置"最大高度"属性,但调整对话框的大小有一个奇怪的效果,我正试图摆脱它:

  2. 如果内容足够小(通常是几行的列表),则对话框很小,可以调整到更大的大小。asp:gridview不会移动,使对话框变大只会在其下方和右侧添加空白。

  3. 但是,一旦你再次拖动窗口边缘使其变小,白色区域就会保持不变,向上滑动并减少网格视图区域,最终将其缩小为零。

  4. 将gridview设置为100%可以解决这个问题,但如果只用几行将窗口变大,每条线就会有几十个像素高。

  5. 所以我决定用一个不可调整大小的对话框来固定高度,这样就不会有任何东西以不应该的方式移动,但小的内容会在下面用空白填充,我们希望窗口可以调整。

最后,我决定尝试将对话框打开到固定的高度,然后调整其大小以适应我的内容如果同一函数中的内容div小于500px高

我的代码不起作用,我不知道如何实现它,甚至不知道它是否可行。

这是我的JS:

function ShowReferedTasks(title, s) {
        // On affiche la div qui constitue le popup dialog
        document.getElementById('litReferedTasks').style.display = '';
        //On crée le dialog à partir de la même div       
        $('#litReferedTasks').dialog({
            autoOpen: true,
            modal: true,
            resizable: true,
            show: 'drop',
            hide: 'drop',
            width: 800,
            minHeight: 0,
            height: 500,
            title: 'Tâche' + s + ' référée' + s + ' de ' + title            
        });
        /*option 1 (used):*/ var heightDiv = document.getElementById('litReferedTasks').style.height;
        /*option 2:*/ //var heightDiv = $(this).height($('#litReferedTasks').height());
        if (heightDiv < 500)
        {
            $('#litReferedTasks').dialog('option', 'height', heightDiv);
            /*alternative I tried*/ //$("#dialog").dialog('option', 'height', heightDiv);
        }
    }

这是我的div:

<div id="litReferedTasks" style="background-color: White; display: none; height:95%;">
    <asp:GridView ID="gvReferedTasks" runat="server" OnRowDataBound="gvReferedTasks_RowDataBound" Width="97.5%" Visible="false">        
    </asp:GridView>
    <asp:Label ID="lblNoReferedTasks" runat="server" Visible="false" Width="100%"></asp:Label>
</div>

正如你所看到的,我希望我的函数打开对话框,然后确定包含网格视图的div的大小,如果大小低于500像素,我希望对话框的高度调整到网格视图,否则对于大的内容,我只会用滚动条将其保持在500像素高。

谢谢你在这方面的帮助。

更新2:

下面的代码是有效的,但如果关闭我的对话框并重新打开它,那么在大的内容上调整大小就会失败。知道为什么吗?基本上它只工作一次,直到我刷新页面并刷新缓存(Ctrl+F5)

更新1:

我使用了js脚本和@Paul Graffam给我的东西的组合:

将div设置为inline-block似乎奏效了,但js完成了大部分工作:

function ShowReferedTasks(title, s) {
    //On crée le dialog à partir de la même div       
    $('#litReferedTasks').dialog({
        autoOpen: true,
        modal: true,
        resizable: true,
        show: 'drop',
        hide: 'drop',
        width: 800,
        minHeight: 0,
        open: function(event, ui) {
            $(this).css({ 'overflow-y': 'auto' });
        },
        title: 'Tâche' + s + ' référée' + s + ' de ' + title
    });
    // Resizes the dialog to fit the content up to 500px, after which it overflows automatically.
    var heightDiv = $('#litReferedTasks').height();
    if (heightDiv > 450) $('#litReferedTasks').dialog('option', 'height', 500);
}

div然后填充整个对话框,当它变得比它大时就会溢出。打开对话框一开始是为了适应div,无论它有多大,但随后会查看div的大小,如果大于500像素,则会将对话框的大小调整为500像素。

看起来它成功地完成了我想要的操作,没有在div上使用max-height带来的大小调整限制和问题。

我找到的一个简单的方法是将对话div的css设置为max-height设置为500px,然后可以删除对话框中的高度设置。这样,任何超过500px的东西都将被设置为溢出,而任何小于500px的都将自动调整大小,因为高度现在默认为auto。

由于gridview使用表,我认为将div的显示设置为display: inline-block;并删除将显示设置为空的行是很重要的。

我在这里用您的一些代码设置了一个示例:http://jsfiddle.net/rrAJM/1/

此外,我注意到您一直在使用document.getElementById,但由于您使用的是jQuery,因此没有必要这样做。相反,您可以通过以下操作选择元素:$('#litReferedTasks')

例如,document.getElementById('litReferedTasks').style.height;变成$('#litReferedTasks').height();