自动调整jQuery UI对话框的宽度,以适应通过ajax加载的内容。

137

我在这方面遇到了很多麻烦,无法找到具体的信息和示例。我的应用程序中有许多与.ajax()调用加载的div相关联的jQuery UI对话框。它们都使用相同的设置调用:

 $(".mydialog").dialog({
        autoOpen: false,
        resizable: false,
        modal: true
 });

我想让对话框的宽度根据加载的内容自适应。目前,宽度仅保持在300像素(默认值),导致出现水平滚动条。

据我所知,对话框的"autoResize"选项已不再可用,指定该选项不会发生任何事情。

我试图避免为每个对话框编写单独的函数,因此.dialog("option", "width", "500")不是一个好选择,因为每个对话框将具有不同的宽度。

为对话框选项指定width: 'auto'只会使对话框占据浏览器窗口的100%宽度。

我有哪些选择?我正在使用jQuery 1.4.1和jQuery UI 1.8rc1。这似乎应该是非常容易实现的。

编辑:我已经实现了一个笨拙的解决方法,但我仍在寻找更好的解决方案。

14个回答

0

如果您需要在IE7中使用它,您不能使用未记录、有缺陷和不支持{'width':'auto'}选项。相反,将以下内容添加到您的.dialog()中:

'open': function(){ $(this).dialog('option', 'width', this.scrollWidth) }

.scrollWidth 是否包括右侧填充取决于浏览器(Firefox 与 Chrome 不同),因此您可以将一个主观的“足够好”的像素数添加到 .scrollWidth 中,或者用自己的宽度计算函数替换它。

您可能希望在您的 .dialog() 选项中包含 width: 0,因为该方法永远不会减小宽度,只会增加宽度。

已测试可在 IE7、IE8、IE9、IE10、IE11、Firefox 30、Chrome 35 和 Opera 22 中使用。


0

我遇到了同样的问题,在你的 .ui-dialog{} 的 CSS 中使用 position: absolute 并不足够。我注意到实际元素的直接样式上设置了 position: relative,所以 .ui-dialog 的 CSS 定义被覆盖了。在我将要创建一个静态对话框的 div 上设置 position: absolute 也无效。

最后,我在我的本地 jQuery 中进行了两处修改,使其正常工作。

我将 jQuery 中的以下行修改为:

elem.style.position = "absolute";

https://github.com/jquery/jquery/blob/1.8.0/src/offset.js#L62

另外,由于我的对话框被设置为可拖动,因此我还需要在jQuery-ui中更改这一行:

this.element[0].style.position = 'absolute';

https://github.com/jquery/jquery-ui/blob/1-8-stable/ui/jquery.ui.draggable.js#L48

也许更彻底地检查我的样式会解决问题,但我想分享一下我是如何让它工作的。


0

补充Vladimir Kornea的答案。

我想要一种方法来设置宽度,除非屏幕太小,然后使用动态宽度。虽然不是真正的“响应式”,但在大多数情况下都能很好地工作。

, 'open': function(){
   var resposive_width = ($( window ).width() > 640) ? 640 : ($( window ).width() - 20);
   $(this).dialog('option', 'width', resposive_width)
 }

-1

请编辑下面的内容:

$("#message").dialog({
 autoOpen:false,
 modal:true,
 resizable: false,
 width:'80%',


3
请在您的代码中添加一些解释 - 为什么应该编辑您的答案? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接