JQuery UI iletişim kutusunu ajax tarafından yüklenen içeriğin genişliğine göre otomatik olarak yeniden boyutlandır


134

Bununla ilgili özel bilgi ve örnekler bulmakta zorlanıyorum. Uygulamamda .ajax () çağrıları ile yüklenen div'lere bağlı bir dizi jQuery UI iletişim kutusu var. Hepsi aynı kurulum çağrısını kullanır:

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

Sadece iletişim kutusunun yüklenen içeriğin genişliğine göre yeniden boyutlandırılmasını istiyorum. Şu anda, genişlik sadece 300 piksel (varsayılan) olarak kalıyor ve yatay bir kaydırma çubuğu alıyorum.

Anlayabildiğim kadarıyla, "autoResize" artık diyaloglar için bir seçenek değil ve bunu belirlediğimde hiçbir şey olmuyor.

.dialog("option", "width", "500")Her iletişim kutusu farklı bir genişliğe sahip olacağı için her bir iletişim kutusu için ayrı bir işlev yazmaya çalışmıyorum, bu yüzden gerçekten bir seçenek değil.

width: 'auto'İletişim kutusu seçenekleri belirtildiğinde , iletişim kutuları tarayıcı penceresinin genişliğinin% 100'ünü kaplar.

Seçeneklerim neler? JQuery 1.4.1 ile jQuery UI 1.8rc1 kullanıyorum. Bu gerçekten kolay bir şey olmalı gibi görünüyor.

EDIT: Bunun için kludgy bir geçici çözüm uyguladım, ancak yine de daha iyi bir çözüm arıyorum.

Yanıtlar:


250

JQuery 1.4.1 ve UI 1.8rc1 kullanarak küçük bir örnek uygulama yazdım. Tüm yaptığım yapıcı olarak belirtmek oldu:

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

Bunun tarayıcı penceresinin% 100 genişliğini kapladığını söylediğinizi biliyorum, ancak burada tatlı çalışıyor, FF3.6, Chrome ve IE8'de test edildi.

AJAX aramaları yapmıyorum, sadece iletişim kutusunun HTML'sini manuel olarak değiştiriyorum, ancak herhangi bir probun neden olacağını sanmıyorum. Başka bir css ayarı bunu çalıyor olabilir mi?

Bununla ilgili tek sorun, genişliği merkezden uzaklaştırmasıdır, ancak bu destek biletinidialog('open') , sorunu düzeltmek için bir setTimeout'ta ifadeyi yerleştirmenin bir çözümünü sağladıkları yerde buldum .

İşte baş etiketimin içeriğ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>

Http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc1.zip adresinden Jquery UI için js ve css'i indirdim . ve vücut:

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

Fermin - örnek ve yayınınız için teşekkürler. CSS ile ilgili bir sorun olduğu ortaya çıktı, ancak kesin sorunun ne olduğu hala belli değil (yine de Firebug'dan kesinlikle belli değildi). Tüm diyalog bölümlerimi en üst seviyeye taşıyarak ve varsayılan 1.8.1 CSS'yi (temalı sürümümüz yerine) kullanarak harika çalışıyor. 1.8.1 sürümü düştüğünde temalı sürümümüzü yavaş yavaş geri taşıyacağım ve sorunun kökünü bulacağım. Teşekkürler!
womp

Sorun değil, sevindim yardım edebilirim. Daha önce orada bulundum, bir seferde 1 css deyimi hareket bir durum .... tadını çıkarın!
Fermin

2
IE7 olsa kırık görünüyor
Alex

2
İçeriği yüklemek için AJAX kullanıyorsanız, setTimeout () güvenilir bir çözüm sunmayabilir (örneğin, sunucu yavaşsa ve yüklenmesi 100ms'den uzun sürdüyse). Açmayı tetiklemek için .ajax () yönteminin geri arama işlevini kullanmak daha iyi bir çözüm olacaktır. Bu şekilde sayfa yükleme işlemi tamamlanana kadar açılmaz.
njbair

1
{'width':'auto'}IE7'de çalışmaz ve scott.gonzalez'e göre {'width':'auto'}seçenek jQuery-UI tarafından desteklenmediği için düzeltilmeyecektir: "İletişim kutuları otomatik genişliği desteklemez. Dokümanlar, seçeneğin yalnızca kullanılacak bir sayıyı kabul ettiğini belirtir. bir piksel boyutu için. Bkz jquery-ui-dev iplik oto genişliği desteklemeyeceğini neden hakkında görüşmek için."
Vladimir Kornea

11

Aynı sorun vardı ve gerçek sorunun CSS ile ilgili olduğunu belirterek teşekkür ederim sorunu buldum:

Having position:relativeyerine position:absolutesizin de .ui-dialogCSS kuralı iletişim yapar ve width:'auto'garip davranırlar.

.ui-dialog { position: absolute;}


2

Float ayarlamayı hayal ediyorum: diyalog için sol işe yarayacak. Muhtemelen diyalog kesinlikle eklenti tarafından konumlandırılır, bu durumda konumu bununla belirlenecektir, ancak şamandıranın - sadece içeriği tutmak için ihtiyaç duydukları kadar geniş yapan elemanların yan etkisi yine de etkili olacaktır.

Eğer sadece bir kural koyarsanız,

.myDialog {float:left}

jQuery kullanarak ayarlamanız gerekebilir.


2

Jquery UI'yi karşılık gelen temayı yükseltmeden 1.8.1'e yükselttiğimde de aynı sorunu yaşadım. Sadece temayı yükseltmek için gereklidir ve "otomatik" tekrar çalışır.


2

Nedense bu kesmek yapılan IE7 ile bu tam sayfa genişliği sorunu devam etti:

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

Maksimum genişlik belirterek% 100 genişlik sorununu önleyebilirsiniz. maxWidthOpsiyon çalışmaları görünmüyor; max-widthbunun yerine iletişim kutusu widget'ında CSS özelliğini ayarlayın .

Maksimum yüksekliği sınırlamak istiyorsanız, maxHeightseçeneği kullanın. Gerektiğinde doğru bir kaydırma çubuğu gösterecektir.

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

Benzer bir sorun yaşadım.

Ayar widthiçin "auto"benim için çalıştı cezası ancak iletişim miktarda metin içeren zaman görmezden, bu sayfanın tam genişliğini kapsayan yapılan maxWidthayarı.

Ayar maxWidthüzerinde createcezası olsa çalışır:

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

1

Ben de bu problemi yaşadım.

Ben bununla çalıştım:

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

1

Tüm yapmanız gereken sadece eklemek:

width: '65%',

OP'nin sorusuna dayanarak, bu tüm iletişim kutuları için işe yaramaz ve yine de her iletişim kutusunu ayrı ayrı ayarlaması gerekir.
roelofs

0

Aynı sorun var ve pozisyon: .ui-dialog {} css mutlak yeterli değildi. Bu pozisyonun farkına vardım: göreceli, gerçek öğenin doğrudan stiline ayarlanmıştı, bu yüzden .ui-dialog css tanımının üzerine yazılıyordu. Ayar konumu: div üzerinde mutlak bir diyalog kuracaktım statik olarak da çalışmadı.

Sonunda bu işi yapmak için yerel jQuery yerleştirilen iki değiştirdi.

Aşağıdaki satır jQuery olarak değiştirildi:

elem.style.position = "absolute";

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

Ayrıca, benim diyalog sürüklenebilir olarak ayarlandığından, jQuery-ui de bu satırı değiştirmek zorunda kaldı:

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

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

Belki de daha iyiye sahip olduğum stilden geçtikçe işleri düzeltirdim, ama bunu nasıl çalıştığımı paylaşacağımı düşündüm.


0

IE7'de çalışması gerekiyorsa, belgesiz, buggy ve desteklenmeyen {'width':'auto'} seçeneği kullanamazsınız . Bunun yerine aşağıdakileri ekleyin .dialog():

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

İster .scrollWidthya piksel öznel bir "yeterince iyi" numara ekleyebilirsiniz böylece sağ taraftaki dolgu, tarayıcı (Chrome'dan Firefox farklıdır) bağlıdır içerir .scrollWidthveya kendi genişlik hesaplama fonksiyonu ile değiştirin.

Seçeneklerinizin width: 0arasına dahil etmek isteyebilirsiniz .dialog(), çünkü bu yöntem genişliği asla azaltmaz, yalnızca artırır.

IE7, IE8, IE9, IE10, IE11, Firefox 30, Chrome 35 ve Opera 22'de çalıştığı test edilmiştir.


-1

bu feryat düzenle:

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


3
Lütfen kodunuza bir açıklama ekleyin - yanıtınızı neden düzenlemek gerekir?
Nico Haase
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.