Автоматично змінити розмір діалогового вікна інтерфейсу jQuery до ширини вмісту, завантаженого ajax


134

У мене дуже багато проблем з пошуку конкретної інформації та прикладів з цього приводу. У моєму додатку є ряд діалогів інтерфейсу jQuery, доданих до divs, завантажених дзвінками .ajax () Всі вони використовують один і той же заклик налаштування:

 $(".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. Схоже, це має бути щось, що насправді легко.

EDIT: Я реалізував для цього химерне рішення, але все ще шукаю кращого рішення.

Відповіді:


250

Я щойно написав крихітний зразок програми, використовуючи 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 з 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>

Фермін - дякую за Ваш приклад та повідомлення. Виявляється, це справді була проблема з CSS, хоча досі не ясно, яка саме була проблема (з Firebug це все одно не було очевидно). Перемістивши всі мої діалогові диви на верхній рівень та використовуючи стандартний CSS 1.8.1 (замість нашої тематичної версії), він чудово працює. Я поступово перенесу нашу тематичну версію назад, коли випуститься версія 1.8.1, і знайду корінь проблеми. Дякую!
утроба

Без проблем, рада, що можу допомогти. Я там був раніше, це випадок переміщення заяви 1 css за один раз .... насолоджуйтесь!
Фермін

2
IE7, здається, зламаний
Алекс

2
Якщо ви використовуєте AJAX для завантаження вмісту, setTimeout () може не забезпечити надійного рішення (наприклад, якщо сервер був повільним і завантажувалося більше 100 мс). Кращим рішенням буде використання функції зворотного виклику методу .ajax () для запуску відкритого. Таким чином він не відкриється, поки завантаження сторінки не завершиться.
njbair

1
{'width':'auto'}не працює в IE7 і не буде виправлено, оскільки {'width':'auto'}опція не підтримується jQuery-UI згідно scott.gonzalez: "Діалог не підтримує автоматичну ширину. Документи заявляють, що опція приймає лише число, яке буде використано для розміру пікселів. Див. розділ jquery-ui-dev для обговорення того, чому ми не підтримуємо автоматичну ширину. "
Володимир Корнеа

11

У мене була така ж проблема, і завдяки тому, що ви зазначили, що справжня проблема була пов'язана з CSS, я знайшов проблему:

Якщо position:relativeзамість цього position:absoluteу вашому .ui-dialogправилі CSS встановити діалог і width:'auto'вести себе дивно.

.ui-dialog { position: absolute;}


2

Я думаю, що налаштування float: ліворуч для діалогу буде працювати. Імовірно, діалог абсолютно розміщений плагіном, і в цьому випадку його положення визначатиметься цим, але побічний ефект поплавця, що робить елементи лише настільки широкими, наскільки вони повинні мати вміст, все ще набере чинності.

Це має спрацювати, якщо ви просто встановили таке правило

.myDialog {float:left}

у вашому аркуші стилів, хоча вам може знадобитися встановити його за допомогою jQuery


2

У мене була така ж проблема, коли я модернізував інтерфейс jquery до 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,
    ...

2

Ви можете уникнути проблеми зі 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>


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

У мене була і ця проблема.

У мене це працює з цим:

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

1

Все, що вам потрібно зробити, це лише додати:

width: '65%',

Виходячи з питання ОП, це не спрацювало б для всіх його діалогових вікон, і йому все одно потрібно було б встановити кожне діалогове вікно окремо.
roelofs

0

У мене така ж проблема і з позицією: абсолютного у вашому .ui-діалозі {} css було недостатньо. Я помітив це положення: відносне значення встановлюється у прямому стилі фактичного елемента, тому визначення css-діалогу css переписується. Позиція налаштування: абсолютне значення на діві, я збирався встановити діалог статично, також не працював.

Врешті-решт я змінив два розміщених у своєму місцевому 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

Якщо вам це потрібно для роботи в IE7, ви не можете використовувати опцію недокументованого, баггі та непідтримуваного {'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.


-1

відредагуйте це нижче:

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


3
Будь ласка, додайте до свого коду пояснення - чому слід редагувати свою відповідь?
Ніко Хааз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.