ปรับขนาดกล่องโต้ตอบ jQuery UI โดยอัตโนมัติตามความกว้างของเนื้อหาที่โหลดโดย ajax


134

ฉันมีปัญหาในการค้นหาข้อมูลและตัวอย่างที่เฉพาะเจาะจงเกี่ยวกับเรื่องนี้ ฉันมีกล่องโต้ตอบ jQuery UI จำนวนหนึ่งในแอปพลิเคชันของฉันที่แนบมากับ div ที่โหลดด้วยการเรียก. jQuery () พวกเขาทั้งหมดใช้การเรียกการตั้งค่าเดียวกัน:

 $(".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 ดูเหมือนว่านี่น่าจะเป็นอะไรที่ง่ายจริงๆ

แก้ไข: ฉันได้ใช้วิธีแก้ปัญหาสำหรับสิ่งนี้แล้ว แต่ฉันยังคงมองหาวิธีแก้ปัญหาที่ดีกว่า

คำตอบ:


252

ฉันเพิ่งเขียนแอปตัวอย่างเล็ก ๆ โดยใช้ 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 อื่น ๆ อาจทำให้เกิดปัญหานี้ได้หรือไม่?

ปัญหาเดียวของสิ่งนี้คือทำให้ความกว้างอยู่นอกกึ่งกลาง แต่ฉันพบตั๋วการสนับสนุนนี้ซึ่งพวกเขาจัดหาวิธีแก้ปัญหาในการวางdialog('open')คำสั่งใน setTimeout เพื่อแก้ไขปัญหา

นี่คือเนื้อหาของแท็กหัวของฉัน:

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

ฉันดาวน์โหลด js และ CSS สำหรับ Jquery UI จาก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>

Fermin - ขอบคุณสำหรับตัวอย่างและโพสต์ของคุณ ปรากฎว่ามันเป็นปัญหากับ CSS จริงๆแม้ว่าจะยังไม่ชัดเจนว่าปัญหาที่แท้จริงคืออะไร (มันไม่ชัดเจนจาก Firebug อยู่ดี) การย้ายไดอะล็อก Divs ทั้งหมดของฉันไปที่ระดับบนสุดและใช้ 1.8.1 CSS เริ่มต้น (แทนที่จะเป็นเวอร์ชันธีมของเรา) มันใช้งานได้ดี ฉันจะค่อยๆย้ายเวอร์ชันที่เป็นธีมของเรากลับไปเมื่อรุ่น 1.8.1 ลดลงและค้นหาต้นตอของปัญหา ขอบคุณ!
womp

ไม่มีปัญหาฉันดีใจที่ช่วยได้ ฉันเคยไปที่นั่นมาก่อนเป็นกรณีของการย้ายคำสั่ง css ครั้งละ 1 รายการ .... สนุก!
Fermin

2
ดูเหมือนว่า IE7 จะเสีย
Alex

2
หากคุณใช้ AJAX เพื่อโหลดเนื้อหา setTimeout () อาจไม่ได้ให้โซลูชันที่เชื่อถือได้ (ตัวอย่างเช่นหากเซิร์ฟเวอร์ทำงานช้าและใช้เวลาโหลดนานกว่า 100 มิลลิวินาที) ทางออกที่ดีกว่าคือการใช้ฟังก์ชันเรียกกลับของเมธอด. jax () เพื่อเรียกการเปิด วิธีนี้จะไม่เปิดขึ้นจนกว่าการโหลดหน้าเว็บจะเสร็จสมบูรณ์
njbair

1
{'width':'auto'}ไม่ทำงานใน IE7 และจะไม่ได้รับการแก้ไขเนื่องจากjQuery-UI ไม่รองรับ{'width':'auto'}ตัวเลือกตาม scott.gonzalez: "กล่องโต้ตอบไม่รองรับความกว้างอัตโนมัติเอกสารระบุว่าตัวเลือกยอมรับเฉพาะตัวเลขซึ่งจะใช้ สำหรับขนาดพิกเซลดูหัวข้อjquery-ui-devสำหรับการสนทนาเกี่ยวกับสาเหตุที่เราไม่รองรับความกว้างอัตโนมัติ "
Vladimir Kornea

11

มีปัญหาเดียวกันและขอบคุณที่คุณแจ้งว่าปัญหาจริงเกี่ยวข้องกับ CSS ฉันพบปัญหา:

การมีposition:relativeแทนที่จะposition:absoluteอยู่ใน.ui-dialogกฎ CSS ของคุณทำให้กล่องโต้ตอบและwidth:'auto'ทำงานแปลก ๆ

.ui-dialog { position: absolute;}


3

คุณสามารถหลีกเลี่ยงปัญหาความกว้าง 100% โดยระบุความกว้างสูงสุด maxWidthตัวเลือกที่ดูเหมือนจะไม่ทำงาน ดังนั้นตั้งค่าmax-widthคุณสมบัติCSS บนวิดเจ็ตไดอะล็อกแทน

ในกรณีที่คุณต้องการ จำกัด ความสูงสูงสุดให้ใช้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>


2

ฉันคิดว่าการตั้งค่า float: ทิ้งไว้สำหรับกล่องโต้ตอบจะใช้งานได้ สมมติว่ากล่องโต้ตอบอยู่ในตำแหน่งที่แน่นอนโดยปลั๊กอินซึ่งในกรณีนี้ตำแหน่งของมันจะถูกกำหนดโดยสิ่งนี้ แต่ผลข้างเคียงของการลอย - ทำให้องค์ประกอบกว้างเท่าที่จำเป็นเพื่อเก็บเนื้อหา - จะยังคงมีผล

สิ่งนี้ควรใช้งานได้หากคุณใส่กฎเช่น

.myDialog {float:left}

ในสไตล์ชีตของคุณแม้ว่าคุณอาจต้องตั้งค่าโดยใช้ jQuery


2

ฉันมีปัญหาเดียวกันเมื่อฉันอัปเกรด jquery UI เป็น 1.8.1 โดยไม่ได้อัปเกรดธีมที่เกี่ยวข้อง จำเป็นเท่านั้นในการอัปเกรดธีมด้วยและ "อัตโนมัติ" จะทำงานอีกครั้ง


2

ด้วยเหตุผลบางอย่างฉันยังคงมีปัญหาความกว้างเต็มหน้ากับ 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,
    ...

1

ฉันมีปัญหาที่คล้ายกัน

การตั้งค่าwidthให้ใช้"auto"งานได้ดีสำหรับฉัน แต่เมื่อกล่องโต้ตอบมีข้อความจำนวนมากมันทำให้มันขยายเต็มความกว้างของหน้าโดยไม่สนใจการmaxWidthตั้งค่า

การตั้งค่าmaxWidthในการcreateทำงานได้ดีแม้ว่า:

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


1

สิ่งที่คุณต้องทำมีเพียงเพิ่ม:

width: '65%',

จากคำถามของ OP นั่นจะใช้ไม่ได้กับกล่องโต้ตอบทั้งหมดของเขาและเขายังคงต้องตั้งค่ากล่องโต้ตอบทีละกล่อง
roelofs

0

ฉันมีปัญหาเดียวกันและมีตำแหน่ง: แน่นอนใน css .ui-dialog {} ของคุณไม่เพียงพอ ฉันสังเกตเห็นว่าตำแหน่งนั้น: ญาติถูกตั้งค่าในรูปแบบโดยตรงขององค์ประกอบจริงดังนั้นคำจำกัดความ css .ui-dialog จึงถูกเขียนทับ การตั้งค่าตำแหน่ง: สัมบูรณ์ใน div ที่ฉันกำลังจะสร้างไดอะล็อกแบบคงที่ก็ใช้ไม่ได้เช่นกัน

ในท้ายที่สุดฉันเปลี่ยนสองตำแหน่งใน 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

หากคุณจำเป็นต้องใช้มันในการทำงานใน 7 คุณไม่สามารถใช้ที่ไม่มีเอกสารรถและได้รับการสนับสนุน {'width':'auto'}ตัวเลือก ให้เพิ่มสิ่งต่อไปนี้แทน.dialog():

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

ไม่ว่าจะ.scrollWidthมีช่องว่างด้านขวาขึ้นอยู่กับเบราว์เซอร์ (Firefox แตกต่างจาก Chrome) เพื่อให้คุณสามารถเพิ่มอัตนัยจำนวน "ดีพอ" ของพิกเซล.scrollWidthหรือแทนที่ด้วยฟังก์ชั่นความกว้างคำนวณของคุณเอง

คุณอาจต้องการรวมไว้width: 0ใน.dialog()ตัวเลือกของคุณเนื่องจากวิธีนี้จะไม่ลดความกว้าง แต่จะเพิ่มขึ้นเท่านั้น

ผ่านการทดสอบการทำงานใน IE7, IE8, IE9, IE10, IE11, Firefox 30, Chrome 35 และ Opera 22


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.