代码之家  ›  专栏  ›  技术社区  ›  womp

根据Ajax加载的内容宽度自动调整jquery用户界面对话框的大小

  •  133
  • womp  · 技术社区  · 15 年前

    我很难找到具体的信息和例子。我的应用程序中有许多jquery用户界面对话框附加到了使用.ajax()调用加载的div。它们都使用相同的设置调用:

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

    我只想让对话框调整到加载内容的宽度。现在,宽度保持在300px(默认值),我得到一个水平滚动条。

    据我所知,“autoresize”不再是对话框的选项,当我指定它时什么也不会发生。

    我试图不为每个对话框编写单独的函数,所以 .dialog("option", "width", "500") 实际上不是一个选项,因为每个对话框的宽度都不同。

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

    我有什么选择?我将jquery 1.4.1与jquery ui 1.8rc1结合使用。看起来这应该是很容易的事情。

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

    12 回复  |  直到 7 年前
        1
  •  249
  •   Fermin    15 年前

    我刚刚用jquery 1.4.1和ui 1.8rc1编写了一个很小的示例应用程序。我所做的只是将构造函数指定为:

    var theDialog = $(".mydialog").dialog({
            autoOpen: false,
            resizable: false,
            modal: true,
            width:'auto'
    });
    

    我知道你说过,这使得它占据了浏览器窗口的100%宽度,但是它在这里工作得很好,在ff3.6、chrome和ie8中进行了测试。

    我不是在进行Ajax调用,只是手动更改对话框的HTML,但不认为这会引起任何问题。其他的CSS设置会破坏它吗?

    唯一的问题是宽度偏离了中心,但我发现了 support ticket 他们提供了一个解决方案 dialog('open') 设置时间以解决问题的语句。

    这是我头牌的内容:

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
    <script type="text/javascript" src="jquery-ui.min.js"></script>
    <link href="jquery-ui.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
        $(function(){
            var theDialog = $(".mydialog").dialog({
                autoOpen: false,
                resizable: false,
                modal: true,
                width: 'auto'
            });
    
            $('#one').click(function(){
                theDialog.html('some random text').dialog('open');
            });
    
            $('#two').click(function(){
                theDialog.html('<ul><li>Apple</li><li>Orange</li><li>Banana</li><li>Strawberry</li><li>long text string to see if width changes</li></ul>').dialog('open');
            });
    
            $('#three').click(function(){
                //this is only call where off-centre is noticeable so use setTimeout
                theDialog.html('<img src="./random.gif" width="500px" height="500px" />');
                setTimeout(function(){ theDialog.dialog('open') }, 100);;
            });
         });
    </script>
    

    我从下载了jquery用户界面的js和css。 http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc1.zip . 身体:

    <div class='mydialog'></div>
    <a href='#' id='one'>test1</a>
    <a href='#' id='two'>test2</a>
    <a href='#' id='three'>test3</a>
    
        2
  •  11
  •   Yannick Blondeau    12 年前

    有同样的问题,感谢你提到真正的问题与CSS有关,我发现了这个问题:

    position:relative 而不是 position:absolute 在你 .ui-dialog CSS规则使对话框和 width:'auto' 举止怪异。

    .ui-dialog { position: absolute;}
    
        3
  •  3
  •   Community CDub    8 年前

    我是这样做的:

    Responsive jQuery UI Dialog ( and a fix for maxWidth bug )

    修复maxwidth&width:auto bug。

        4
  •  2
  •   wheresrhys    15 年前

    我想设置float:left对于对话框是有效的。假设对话框是完全由插件定位的,在这种情况下,它的位置将由这个决定,但是浮动元素的副作用-使元素的宽度仅与保存内容的宽度一样-仍然有效。

    如果你把一条规则

    .myDialog {float:left}
    

    在样式表中,尽管您可能需要使用jquery设置它

        5
  •  2
  •   Jesús Alonso    15 年前

    在没有升级相应主题的情况下,将jquery ui升级到1.8.1时也遇到了同样的问题。只需升级主题即可,“自动”再次工作。

        6
  •  2
  •   Alex    13 年前

    出于某种原因,我一直对IE7有完整的页面宽度问题,所以我进行了以下黑客攻击:

    var tag = $("<div></div>");
    //IE7 workaround
    var w;
    if (navigator.appVersion.indexOf("MSIE 7.") != -1)
        w = 400;
    else
        w = "auto";
    
    tag.html('My message').dialog({
        width: w,
        maxWidth: 600,
        ...
    
        7
  •  2
  •   Salman Arshad    7 年前

    通过指定最大宽度,可以避免100%宽度问题。这个 maxWidth 选项似乎不起作用;因此设置CSS max-width 属性。

    如果还想限制最大高度,请使用 maxHeight 选择权。必要时,它将正确显示滚动条。

    $(function() {
      var $dialog = $("#dialog");
      $dialog.dialog({
        autoOpen: false,
        modal: true,
        width: "auto"
      });
      /*
       * max-width should be set on dialog widget because maxWidth option has known issues
       * max-height should be set using maxHeight option
       */
      $dialog.dialog("widget").css("max-width", $(window).width() - 100);
      $dialog.dialog("option", "maxHeight", $(window).height() - 100);
      $(".test-link").on("click", function(e) {
        e.preventDefault();
        $dialog.html($(this.hash).html());
        // if you change the content of dialog after it is created then reset the left
        // coordinate otherwise content only grows up to the right edge of screen
        $dialog.dialog("widget").css({ left: 0 });
        $dialog.dialog("open");
      });
    });
    @import url("https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.min.css");
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    
    <div id="dialog"></div>
    
    <!-- test links -->
    
    <p>
      <a href="#content-1" class="test-link">Image (Landscape)</a>
      <a href="#content-2" class="test-link">Image (Portrait)</a>
      <a href="#content-3" class="test-link">Text Content (Small)</a>
      <a href="#content-4" class="test-link">Text Content (Large)</a>
    </p>
    <p>If you are viewing in Stack Snippets > Full page then reload the snippet so that window height is recalculated (Right click > Reload frame).</p>
    
    <!-- sample content -->
    
    <div id="content-1" style="display: none;">
      <img src="https://i.stack.imgur.com/5leq2.jpg" width="450" height="300">
    </div>
    
    <div id="content-2" style="display: none;">
      <img src="https://i.stack.imgur.com/9pVkn.jpg" width="300" height="400">
    </div>
    
    <div id="content-3" style="display: none;">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sodales eu urna sit amet fermentum. Morbi ornare, leo ut ornare volutpat, nibh diam mattis elit, eget porta sapien quam eu mi. Nullam sollicitudin, nibh non suscipit commodo, nisi metus bibendum urna, vitae congue nisl risus eu tellus. Praesent diam ligula, hendrerit eget bibendum quis, convallis eu erat. Aliquam scelerisque turpis augue, sit amet dictum urna hendrerit id. Vestibulum luctus dolor quis ex sodales, nec aliquet lacus elementum. Mauris sollicitudin dictum augue eget posuere. Suspendisse diam elit, scelerisque eu quam vel, tempus sodales metus. Morbi et vehicula elit. In sit amet bibendum mi.</p>
    </div>
    
    <div id="content-4" style="display: none;">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sodales eu urna sit amet fermentum. Morbi ornare, leo ut ornare volutpat, nibh diam mattis elit, eget porta sapien quam eu mi. Nullam sollicitudin, nibh non suscipit commodo, nisi metus bibendum urna, vitae congue nisl risus eu tellus. Praesent diam ligula, hendrerit eget bibendum quis, convallis eu erat. Aliquam scelerisque turpis augue, sit amet dictum urna hendrerit id. Vestibulum luctus dolor quis ex sodales, nec aliquet lacus elementum. Mauris sollicitudin dictum augue eget posuere. Suspendisse diam elit, scelerisque eu quam vel, tempus sodales metus. Morbi et vehicula elit. In sit amet bibendum mi.</p>
      <p>Aenean eu magna tempor, pellentesque arcu eget, mattis enim. Cras at volutpat mi. Aenean id placerat felis, quis imperdiet nunc. Aenean a iaculis est, quis lacinia nisl. Sed aliquet sem eget justo convallis congue. Quisque rhoncus nulla sit amet cursus maximus. Phasellus nec auctor urna. Nam mattis felis et diam finibus consectetur. Etiam finibus dignissim vestibulum. In eu urna mattis dui pharetra iaculis. Nam eleifend odio et massa imperdiet, et hendrerit mauris tempor. Quisque sapien lorem, dapibus ut ultricies ut, hendrerit in nulla. Nunc lobortis mi libero, nec tincidunt lacus pretium at. Aliquam erat volutpat.</p>
      <p>Fusce eleifend enim nec massa porttitor tempor a eget neque. Quisque vel augue ac urna posuere iaculis. Morbi pharetra augue ac interdum pulvinar. Duis vel posuere risus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut vitae lectus non nisl iaculis volutpat nec vitae ante. Maecenas quis condimentum elit. Sed nisl urna, convallis ut pellentesque sit amet, pellentesque eget quam. Pellentesque ornare sapien ac scelerisque pretium. Pellentesque metus tortor, accumsan in vehicula iaculis, efficitur eget nisi. Donec tincidunt, felis vel viverra convallis, lectus lectus elementum magna, faucibus viverra risus nulla in dolor.</p>
      <p>Duis tristique sapien ut commodo laoreet. In vel sapien dui. Vestibulum non bibendum erat. Etiam iaculis vehicula accumsan. Phasellus finibus, elit et molestie luctus, massa arcu tempor nulla, id hendrerit metus mauris non mi. Morbi a ultricies magna. Proin condimentum suscipit urna eu maximus. Mauris condimentum massa ac egestas fermentum. Praesent faucibus a neque a molestie. Integer sed diam at eros accumsan convallis.</p>
    </div>
        8
  •  1
  •   tsi    11 年前

    我也有类似的问题。

    设置 width "auto" 对我来说工作得很好,但是当对话框包含大量文本时,它使其跨过了页面的整个宽度,忽略了 maxWidth 设置。

    设置 最大宽度 create 但工作正常:

    $( ".selector" ).dialog({
      width: "auto",
      // maxWidth: 660, // This won't work
      create: function( event, ui ) {
        // Set maxWidth
        $(this).css("maxWidth", "660px");
      }
    });
    
        9
  •  1
  •   P Lysenius    9 年前

    我也有这个问题。

    我把它和这个结合起来:

    .ui-dialog{
        display:inline-block;
    }
    
        10
  •  0
  •   Scott    12 年前

    我也有同样的问题和立场:绝对在你的.ui对话框css中是不够的。我注意到position:relative被设置在实际元素的直接样式上,因此.ui对话框的css定义被覆盖。设置位置:绝对在DIV上,我要做一个对话框静态也不工作。

    最后,我在本地jquery中更改了两个位置以使其正常工作。

    我在jquery中将以下行更改为:

    elem.style.position = "absolute";
    

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

    另外,由于我的对话框设置为Draggable,所以我必须将jquery用户界面中的这一行更改为:

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

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

    也许更彻底地经历我的风格会解决问题,但我想我会分享我是如何完成这项工作的。

        11
  •  0
  •   Val Kornea    10 年前

    如果你需要它在IE7中工作,你不能使用 undocumented, buggy, and unsupported {'width':'auto'} 选择权。相反,将以下内容添加到 .dialog() :

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

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

    你可能想包括 width: 0 在您的 对话() 选项,因为此方法永远不会减小宽度,只会增加宽度。

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

        12
  •  0
  •   Flabetvibes    7 年前

    您只需添加:

    width: '65%',