Як автоматизувати діалогове вікно інтерфейсу jQuery при зміні розміру браузера?


100

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

Ви можете перевірити це на веб-сайті: http://jqueryui.com/demos/dialog/

Клацніть на прикладі "модальне діалогове вікно" та змініть розмір браузера.

Я хотів би мати можливість пускати діалогові автоматичні центри, коли веб-переглядач змінює розмір. Чи можна це зробити ефективно на всіх діалогах у моїй програмі?

Дуже дякую!

Відповіді:


160

Якщо встановити positionпараметр, це змусить це зробити, тому просто використовуйте той самий селектор, що охоплює всі ваші діалоги, де я #dialogтут використовую (якщо він їх не знаходить, не вживаються дії, як і всі jQuery):

інтерфейс jQuery до 1.10

$(window).resize(function() {
    $("#dialog").dialog("option", "position", "center");
});

jQuery UI 1.10 або вище

$(window).resize(function() {
    $("#dialog").dialog("option", "position", {my: "center", at: "center", of: window});
});

Ось ця сама демонстраційна сторінка інтерфейсу jQuery, що додає лише код вище , ми просто додаємо обробник до resizeподії вікна .resize(), тому він запускає перецентр у відповідний час. Сігналы абмеркавання


дякую, це виглядає чудово. Можливо, я мав би сказати, що я не завжди знаю, що таке ідентифікатор мого діалогу, як ось цей (як я можу націлити цей діалог?): Var $ dialog = $ ('<div> <a href = "#" title = "Скасувати"> Скасувати </a> </a> </div> ') .html (assetBrowser) .dialog ({autoOpen: false, назва: "Менеджер активів", модальний: true, closeOnEscape: true, кнопки: кнопки, ширина: 840, висота: 500}); $ dialog.dialog ('відкрито');
Жорре

11
@Jorre - Усі вони отримують один і той же клас при створенні діалогу, щоб зробити його загальним, ви можете це зробити:, $(".ui-dialog-content").dialog("option", "position", "center");це перевірить будь-який діалог :)
Нік Крейвер

3
На жаль, запропонована відповідь впливає на поганий розмір діалогу. Коли ви намагаєтесь змінити розмір за допомогою ручки SE, діалогове вікно буде змінено на всі 4 сторони.

2
Я рекомендую дроселювати або розкривати подію зміни розміру. Я бачив, як IE7 та IE8 переміщують діалогове вікно "за межами" області перегляду через обробник розміру, який виконується занадто багато разів.
BStruthers

2
У нових версіях інтерфейсу jQuery мені потрібно було використовувати {my: "center", at: "center", of: window} замість "center". Я використовую 1.11.0.
Майк Доттерер

20

Як варіант відповіді Еллеседіла,

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

$( window ).resize(function() {
    $(".ui-dialog-content:visible").each(function () {
        $( this ).dialog("option","position",$(this).dialog("option","position"));
    });
});

Хоча +1 для Ellesedil

Редагувати:

Набагато коротша версія, яка чудово працює для окремих діалогів:

$(window).resize(function(){
    $(".ui-dialog-content").dialog("option","position","center");
});

Не обов’язково використовувати .each (), можливо, якщо у вас є унікальні діалоги, до яких ви не хочете торкатися.


використання класу .ui-dialog-content є для всіх діалогів, прийнята відповідь - для конкретного діалогу
П'єр

Ага, правильно. Вибачте. На перший погляд в редакції не помітили різниці.
Ellesedil

Я використовую такий підхід напів успішно. Це як рекламується, але мобільне сафарі iOS 7 дійсно задихається, якщо клавіатура не працює. Я намагався розмити введення (), але пряник розглядає клавіатуру як подію зміни розміру і застрягає в циклі, який ніколи не дозволяє вводити введення. Хтось ще стикається з цим?
Джозеф Юнк

Можливо, додайте лічильник поза .resize()і всередині, якщо лічильник досягає 10або 20потім break;, у мене не було цієї проблеми, я не обслуговую ці пристрої / браузери. Ви повинні спробувати рішення, що якщо воно застряє, ви можете вийти з нього
П'єр

Ваша перша пропозиція спрацювала у формі, а відповідь @Ellesedil не відповіла.
akousmata

13

Більш вичерпну відповідь, яка використовує відповідь Ніка більш гнучко, можна знайти тут .

Нижче наведено адаптацію коду відповідності з цієї теми. Це розширення по суті створює нове налаштування діалогу під назвою autoReposition, яке приймає істинне чи помилкове. Код як написаний за замовчуванням параметр true. Помістіть це у .js-файл у своєму проекті, щоб ваші сторінки могли використовувати його.

    $.ui.dialog.prototype.options.autoReposition = true;
    $(window).resize(function () {
        $(".ui-dialog-content:visible").each(function () {
            if ($(this).dialog('option', 'autoReposition')) {
                $(this).dialog('option', 'position', $(this).dialog('option', 'position'));
            }
        });
    });

Це дозволяє надати "справжнє" або "помилкове" для цього нового налаштування під час створення діалогового вікна на вашій сторінці.

$(function() {
    $('#divModalDialog').dialog({
        autoOpen: false,
        modal: true,
        draggable: false,
        resizable: false,
        width: 435,
        height: 200,
        dialogClass: "loadingDialog",
        autoReposition: true,    //This is the new autoReposition setting
        buttons: {
            "Ok": function() {
                $(this).dialog("close");
            }
        }
    });
});

Тепер це діалогове вікно завжди буде змінити себе. Авторепозиція (або як ви називаєте налаштування) може обробляти будь-які діалогові вікна, у яких немає положення за замовчуванням, і автоматично змінювати їх, коли розмір вікна змінюється. Оскільки ви встановлюєте це під час створення діалогу, вам не потрібно якось ідентифікувати діалог, оскільки функція перестановки стає вбудованою у сам діалог. І найкраща частина полягає в тому, що оскільки це встановлено для кожного діалогу, ви можете самі змінити деякі діалоги, а інші залишатись там, де вони є.

Заслуга користувача scott.gonzalez на форумах jQuery за повне рішення.


Цей доповнення / редагування вже не працює з липня 2014 року. Відповідь від @Pierre працює досі.
вироджений

@degenerate: Можливо, що для оновлення jQuery може знадобитися трохи змінити синтаксис. Я більше не працюю або навіть не маю доступу до проекту, де я це реалізував (насправді я зараз пишу API), тому у мене немає простого способу визначити, чи потрібні якісь зміни для останніх версій jQuery.
Ellesedil

Ця відповідь не працює для останніх версій. Але ідея чудова. Це вміст мого обробника розміру вікон: $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });Він чудово працює :)
nacho4d

@ nacho4d: Ви можете відредагувати відповідь та додати новий код для будь-якої версії jquery, над якою ви працюєте, донизу.
Ellesedil

1
@Ellesedil Я щойно змінив пару рядків у першому фрагменті коду. Насправді це те, що scott.gonzalez написав першим у темі. Я не знаю, чому він змінився $( "#dialog" ).dialog( "option", "position" ) на $(this).data("dialog").options.positionпізніше. У всякому разі, зараз ця відповідь працює!
nacho4d

2

Ще один варіант, який працює лише для CSS, це такий. Від'ємні поля повинні дорівнювати половині вашої висоти та половині вашої ширини. Тож у цьому випадку мій діалог має ширину 720 пікселів на 400 пікселів у висоту. Це центрує його вертикально і горизонтально.

.ui-dialog {
  top:50% !important;
  margin-top:-200px !important; 
  left:50% !important;
  margin-left:-360px !important
}

2

Альтернативно можна використовувати позицію jQuery ui ,

$(window).resize(function ()
{
    $(".ui-dialog").position({
        my: "center", at: "center", of: window
    });
});

0

Привіт усім!

Розчин ванілі JS:

(function() {
  window.addEventListener("resize", resizeThrottler, false);

  var resizeTimeout;

  function resizeThrottler() {
    if (!resizeTimeout) {
      resizeTimeout = setTimeout(function() {
        resizeTimeout = null;
        actualResizeHandler();
      }, 66);
    }
  }

  function actualResizeHandler() {
    $(".ui-dialog-content").dialog("option", "position", { my: "center", at: "center", of: window });
  }
}());

$.isVanillaJS == false
Андрій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.