Tự động thay đổi kích thước hộp thoại UI UI theo chiều rộng của nội dung được tải bởi ajax


134

Tôi gặp nhiều khó khăn khi tìm thông tin và ví dụ cụ thể về vấn đề này. Tôi đã có một số hộp thoại UI UI trong ứng dụng của mình được đính kèm với các div được tải với các lệnh gọi .ajax (). Tất cả đều sử dụng cùng một lệnh gọi thiết lập:

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

Tôi chỉ muốn có hộp thoại thay đổi kích thước theo chiều rộng của nội dung được tải. Ngay bây giờ, chiều rộng chỉ ở mức 300px (mặc định) và tôi nhận được một thanh cuộn ngang.

Theo như tôi có thể nói, "autoResize" không còn là một tùy chọn cho các hộp thoại và không có gì xảy ra khi tôi chỉ định nó.

Tôi đang cố gắng không viết một chức năng riêng cho mỗi hộp thoại, vì vậy .dialog("option", "width", "500")đây không thực sự là một tùy chọn, vì mỗi hộp thoại sẽ có chiều rộng khác nhau.

Chỉ định width: 'auto'cho các tùy chọn hộp thoại chỉ làm cho các hộp thoại chiếm 100% chiều rộng của cửa sổ trình duyệt.

Những lựa chọn của tôi là gì? Tôi đang sử dụng jQuery 1.4.1 với jQuery UI 1.8rc1. Có vẻ như đây là một cái gì đó thực sự dễ dàng.

EDIT: Tôi đã thực hiện một cách giải quyết khác cho việc này, nhưng tôi vẫn đang tìm kiếm một giải pháp tốt hơn.

Câu trả lời:


250

Tôi vừa viết một ứng dụng mẫu nhỏ bằng JQuery 1.4.1 và UI 1.8rc1. Tất cả những gì tôi đã làm là chỉ định hàm tạo là:

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

Tôi biết bạn nói rằng điều này làm cho nó chiếm 100% chiều rộng của cửa sổ trình duyệt nhưng nó hoạt động rất tốt ở đây, được thử nghiệm trong FF3.6, Chrome và IE8.

Tôi không thực hiện các cuộc gọi AJAX, chỉ thay đổi thủ công HTML của hộp thoại nhưng không nghĩ rằng điều đó sẽ gây ra bất kỳ probs nào. Có thể một số cài đặt css khác được gõ này?

Vấn đề duy nhất với điều này là nó làm cho chiều rộng lệch tâm nhưng tôi đã tìm thấy vé hỗ trợ này nơi họ cung cấp một cách giải quyết là đặt dialog('open')câu lệnh trong setTimeout để khắc phục sự cố.

Đây là nội dung của thẻ đầu của tôi:

<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>

Tôi đã tải xuống js và css cho Jquery UI từ http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc1.zip . và cơ thể:

<div class='mydialog'></div>
<a href='#' id='one'>test1</a>
<a href='#' id='two'>test2</a>
<a href='#' id='three'>test3</a>

Fermin - cảm ơn ví dụ và bài viết của bạn. Hóa ra đó thực sự là một vấn đề với CSS, mặc dù vẫn chưa rõ vấn đề chính xác là gì (dù sao thì nó cũng không rõ ràng từ Fireorms). Bằng cách di chuyển tất cả các div hộp thoại của tôi lên cấp cao nhất và sử dụng CSS 1.8.1 mặc định (thay vì phiên bản theo chủ đề của chúng tôi), nó hoạt động rất tốt. Tôi sẽ dần dần chuyển phiên bản theo chủ đề của chúng tôi trở lại khi bản phát hành 1.8.1 giảm xuống và tìm ra nguyên nhân của vấn đề. Cảm ơn!
vào

Không có vấn đề, vui mừng tôi có thể giúp đỡ. Tôi đã từng ở đó trước đây, đó là một trường hợp di chuyển tuyên bố 1 css tại một thời điểm .... thưởng thức!
Fermin

2
IE7 dường như bị hỏng mặc dù
Alex

2
Nếu bạn sử dụng AJAX để tải nội dung, setTimeout () có thể không cung cấp giải pháp đáng tin cậy (ví dụ: nếu máy chủ bị chậm và mất hơn 100ms để tải). Một giải pháp tốt hơn là sử dụng hàm gọi lại của phương thức .ajax () để kích hoạt mở. Bằng cách đó, nó sẽ không mở cho đến khi tải trang hoàn tất.
njbair

1
{'width':'auto'}không hoạt động trong IE7 và sẽ không được sửa vì {'width':'auto'}tùy chọn này không được jQuery-UI hỗ trợ theo scott.gonzalez: "Hộp thoại không hỗ trợ độ rộng tự động. Các tài liệu chỉ ra rằng tùy chọn chỉ chấp nhận một số, sẽ được sử dụng để biết kích thước pixel. Xem chủ đề jquery-ui-dev để thảo luận về lý do tại sao chúng tôi sẽ không hỗ trợ độ rộng tự động. "
Vladimir Kornea

11

Có cùng một vấn đề và nhờ bạn đề cập rằng vấn đề thực sự có liên quan đến CSS, tôi đã tìm thấy vấn đề:

position:relativethay vì position:absolutetrong .ui-dialogquy tắc CSS của bạn làm cho hộp thoại và width:'auto'hành xử kỳ lạ.

.ui-dialog { position: absolute;}


2

Tôi tưởng tượng thiết lập float: left cho hộp thoại sẽ hoạt động. Có lẽ hộp thoại được định vị tuyệt đối bởi plugin, trong trường hợp đó, vị trí của nó sẽ được xác định bởi điều này, nhưng hiệu ứng phụ của float - làm cho các phần tử chỉ rộng đến mức cần thiết để giữ nội dung - vẫn sẽ có hiệu lực.

Điều này sẽ hoạt động nếu bạn chỉ cần đặt một quy tắc như

.myDialog {float:left}

trong biểu định kiểu của bạn, mặc dù bạn có thể cần phải thiết lập nó bằng jQuery


2

Tôi gặp vấn đề tương tự khi tôi nâng cấp giao diện người dùng jquery lên 1.8.1 mà không nâng cấp chủ đề tương ứng. Chỉ cần thiết để nâng cấp chủ đề và "tự động" hoạt động trở lại.


2

Vì một số lý do, tôi liên tục gặp vấn đề về độ rộng trang đầy đủ với IE7 nên tôi đã thực hiện bản hack này:

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,
    ...

2

Bạn có thể tránh vấn đề chiều rộng 100% bằng cách chỉ định chiều rộng tối đa. Các maxWidthtùy chọn dường như không làm việc; vì vậy, đặt thuộc tính CSS max-widthtrên widget hộp thoại thay thế.

Trong trường hợp bạn cũng muốn hạn chế chiều cao tối đa, hãy sử dụng maxHeighttùy chọn. Nó sẽ hiển thị chính xác một thanh cuộn khi cần thiết.

$(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>


1

Tôi đã có một vấn đề tương tự.

Thiết widthđể "auto"tốt làm việc cho tôi nhưng khi hộp thoại chứa rất nhiều văn bản nó đã làm cho nó trải dài toàn bộ chiều rộng của trang, bỏ qua các maxWidththiết lập.

Thiết maxWidthvào createhoạt động tốt mặc dù:

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

1

Tôi đã có vấn đề này là tốt.

Tôi đã làm cho nó làm việc với điều này:

.ui-dialog{
    display:inline-block;
}

1

Tất cả bạn cần làm chỉ là thêm:

width: '65%',

Dựa trên câu hỏi của OP, điều đó sẽ không hoạt động đối với tất cả các hộp thoại của anh ấy và anh ấy vẫn sẽ cần phải đặt riêng từng hộp thoại.
roelofs

0

Tôi có cùng một vấn đề và có vị trí: tuyệt đối trong hộp thoại .ui của bạn {} css là không đủ. Tôi nhận thấy vị trí đó: họ hàng được đặt theo kiểu trực tiếp của phần tử thực tế, vì vậy định nghĩa css .ui-đàm thoại đã bị ghi đè. Cài đặt vị trí: tuyệt đối trên div Tôi sẽ tạo một hộp thoại tĩnh cũng không hoạt động.

Cuối cùng, tôi đã thay đổi hai được đặt trong jQuery cục bộ của mình để thực hiện công việc này.

Tôi đã thay đổi dòng sau trong jQuery thành:

elem.style.position = "absolute";

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

Ngoài ra, vì hộp thoại của tôi được đặt thành có thể kéo được, tôi cũng phải thay đổi dòng này trong jQuery-ui thành:

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

tại https://github.com/jquery/jquery-ui/blob/1-8-urdy/ui/jquery.ui.draggable.js#L48

Có lẽ trải qua phong cách mà tôi có kỹ lưỡng hơn sẽ sửa chữa mọi thứ, nhưng nghĩ rằng tôi chia sẻ làm thế nào tôi làm việc này.


0

Nếu bạn cần nó để hoạt động trong IE7, bạn không thể sử dụng tùy chọn không có giấy tờ, lỗi và không được hỗ trợ {'width':'auto'} . Thay vào đó, hãy thêm những điều sau vào .dialog():

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

Việc .scrollWidthbao gồm phần đệm bên phải phụ thuộc vào trình duyệt (Firefox khác với Chrome), do đó bạn có thể thêm số pixel "đủ tốt" chủ quan vào .scrollWidthhoặc thay thế bằng chức năng tính toán độ rộng của riêng bạn.

Bạn có thể muốn bao gồm width: 0trong số các .dialog()tùy chọn của mình , vì phương pháp này sẽ không bao giờ giảm chiều rộng, chỉ tăng nó.

Đã thử nghiệm để hoạt động trong IE7, IE8, IE9, IE10, IE11, Firefox 30, Chrome 35 và Opera 22.


-1

chỉnh sửa dưới đây:

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


3
Vui lòng thêm một số giải thích cho mã của bạn - tại sao một người nên chỉnh sửa câu trả lời của bạn?
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.