Діалогове вікно jQuery UI - не відкривається після закриття


79

У мене проблема з jquery-ui dialog box.

Проблема полягає в тому, що коли я закриваю діалогове вікно, а потім натискаю посилання, яке його запускає, воно не з’являється знову, якщо я не оновлю сторінку.

Як я можу повернути діалогове вікно назад, не оновлюючи фактичну сторінку.

Нижче мій код:

$(document).ready(function() {
    $('#showTerms').click(function()
    {
        $('#terms').css('display','inline');
        $('#terms').dialog({
            resizable: false,
            modal: true,
            width: 400,
            height: 450,
            overlay: { backgroundColor: "#000", opacity: 0.5 },
            buttons:{ "Close": function() { $(this).dialog("close"); } },
            close: function(ev, ui) { $(this).remove(); },
    }); 
});

Дякую

Відповіді:


110

Ви насправді повинні використовувати його $("#terms").dialog({ autoOpen: false });для ініціалізації. Потім ви можете використовувати, $('#terms').dialog('open');щоб відкрити діалогове вікно та $('#terms').dialog('close');закрити його.


1
Це працює чудово. Документи користувацького інтерфейсу jQuery тут не дуже зрозумілі. Але ідея про те, що dialogфункція призначена для ініціалізації, показу та приховування, зрозуміла це для мене. Дякую.
— Стів Купер

Якщо ви завантажуєте це діалогове вікно з HTML, яке може динамічно змінюватися, дуже неінтуїтивно, чому воно не працює. У когось є якісь хороші рішення, які можна застосувати загалом до цих ситуацій?
— Milimetric

@Milimetric Ви завжди можете використовувати $ (this) .remove (); функція в кінці кожної з кнопок вашого діалогового вікна, таким чином, весь діалог буде повністю перероблений з нуля при повторному виклику. Зверніть увагу, що ця функція діє інакше, ніж $ (this) .dialog ("знищити"); оскільки він лише повертає діалогове вікно до попереднього стану, не руйнуючи об’єкт.
— Jeff Noel

14

Я це вирішив.

Я використав замість функції закриття (це не має сенсу), але це спрацювало.

$(document).ready(function() {
$('#showTerms').click(function()
{
    $('#terms').css('display','inline');
    $('#terms').dialog({resizable: false,
        modal: true,
        width: 400,
        height: 450,
        overlay: { backgroundColor: "#000", opacity: 0.5 },
        buttons:{ "Close": function() { $(this).dialog('**destroy**'); } },
        close: function(ev, ui) { $(this).close(); },
    });         
});   
$('#form1 input#calendarTEST').datepicker({ dateFormat: 'MM d, yy' });
});

4
Знищення спрацює, якщо ви використовуєте цей метод, але для роботи close () спочатку створіть діалогове вікно, а потім використовуйте dialog.show (), щоб показати його, потім dialog.close (), щоб закрити, і він знову відкриється без проблем .
— RaeLehman

6
Майже. Ви маєте рацію, спочатку ініціювавши його, але після цього це .dialog ("відкрити") та .dialog ("закрити")
— rdworth

12

в останньому рядку не використовуйте $(this).remove()use$(this).hide() замість цього .

РЕДАКТУВАТИ: щоб пояснити, під час закриття події ви видаляєте #termsdiv з DOM, тому він не повертається. Натомість потрібно просто приховати це.


9

Я вважаю, що ви можете ініціалізувати діалог лише один раз. Наведений вище приклад намагається ініціалізувати діалогове вікно кожного разу, коли клацається #terms. Це спричинить проблеми. Натомість ініціалізація повинна відбуватися поза подією клацання. Ваш приклад, мабуть, повинен виглядати приблизно так:

$(document).ready(function() {
    // dialog init
    $('#terms').dialog({
        autoOpen: false,
        resizable: false,
        modal: true,
        width: 400,
        height: 450,
        overlay: { backgroundColor: "#000", opacity: 0.5 },
        buttons: { "Close": function() { $(this).dialog('close'); } },
        close: function(ev, ui) { $(this).close(); }
    });
    // click event
    $('#showTerms').click(function(){
        $('#terms').dialog('open').css('display','inline');      
    });
    // date picker
    $('#form1 input#calendarTEST').datepicker({ dateFormat: 'MM d, yy' });
});

Я думаю, що як тільки ви це зрозумієте, це має вирішити проблему "відкрити за посиланням", яку ви описали.


3

Для мене такий підхід працює:

Діалогове вікно можна закрити, натиснувши X у діалоговому вікні або натиснувши "Обережно". Я додаю (довільний) ідентифікатор, тому що мені потрібно бути впевненим, що кожен біт html, доданий до dom, буде видалений згодом.

$('<div id="dossier_edit_form_tmp_id">').html(data.form)
.data('dossier_id',dossier_id)
.dialog({
        title: 'Opdracht wijzigen',
        show: 'clip',
        hide: 'clip',
        minWidth: 520,
        width: 520,
        modal: true,
        buttons: { 'Bewaren': dossier_edit_form_opslaan },
        close: function(event, ui){ 
                                  $(this).dialog('destroy'); 
                                  $('#dossier_edit_form_tmp_id').remove();
               }
});

3
 <button onClick="abrirOpen()">Open Dialog</button>

<script type="text/javascript">
var $dialogo = $("<div></div>").html("Aqui tu contenido(here your content)").dialog({
       title: "Dialogo de UI",
       autoOpen: false,
       close: function(ev, ui){
               $(this).dialog("destroy");
       }
 function abrirOpen(){
       $dialogo.dialog("open");
 }
});

//**Esto funciona para mi... (this works for me)**
</script>

3

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

В оригінальному дописі було використано $ (this) .remove (); у обробнику закриття це фактично видалило б діалоговий div з DOM. Спроба знову ініціалізувати діалогове вікно не спрацювала б, оскільки div було видалено.

Використання $ (this) .dialog ('знищити') викликає метод знищення, визначений у діалоговому об'єкті, який не видаляє його з DOM.

З документації:

знищити ()

Повністю видаляє функціональність діалогового вікна. Це поверне елемент назад у його попередній стан >> >>. Цей метод не приймає жодних аргументів.

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



1

.close () є загальним і може використовуватися для посилання на більше об'єктів. .dialog ('закрити') можна використовувати лише з діалоговими вікнами


1

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

var dialog1 = $("#dialog").dialog({ 
              autoOpen: false, 
              height: 480, 
              width: 640 
}); 
$('#tikla').click(function() {  
    dialog1.load('./browser.php').dialog('open');
});   

все, здається, працює чудово.


1

У мене була та ж проблема з діалоговим вікном накладання jquery-ui - воно працювало лише один раз, а потім зупинялося, якщо я не перезавантажу сторінку. Я знайшов відповідь в одному з їх прикладів -
кілька накладок на одній сторінці
flowplayer_tools_multiple_open_close
- хто хоч мав би, правда ?? :-) -

важливим налаштуванням виявилося

oneInstance: false

отже, зараз у мене це так -

$(document).ready(function() {

 var overlays = null;

 overlays = jQuery("a[rel]");

 for (var n = 0; n < overlays.length; n++) {

    $(overlays[n]).overlay({
        oneInstance: false, 
        mask: '#669966',
        effect: 'apple',
        onBeforeLoad: function() {
            overlay_before_load(this);
        }
    });

  }

}

і все працює просто чудово

сподіваюся, це комусь допоможе

О.


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