Диалоговое окно jQuery UI - не открывается после закрытия

У меня проблема с 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(); },
    }); 
});

Спасибо


person David Bonnici    schedule 14.12.2008    source источник


Ответы (11)


На самом деле вы должны использовать $("#terms").dialog({ autoOpen: false }); для его инициализации. Затем вы можете использовать $('#terms').dialog('open');, чтобы открыть диалоговое окно, и $('#terms').dialog('close');, чтобы закрыть его.

person Shane Fulmer    schedule 13.04.2009
comment
Это прекрасно работает. Документы пользовательского интерфейса jQuery здесь не очень понятны. Но идея, что функция dialog предназначена для инициализации, отображения и скрытия, имела для меня смысл. Спасибо. - person Steve Cooper; 21.06.2009
comment
Если вы загружаете это диалоговое окно из HTML, который может динамически изменяться, очень не интуитивно понятно, почему он не работает. У кого-нибудь есть хорошие решения, которые можно применить в целом к ​​этим ситуациям? - person Milimetric; 18.08.2011
comment
@Milimetric Вы всегда можете использовать $ (this) .remove (); функции в конце каждой из кнопок вашего диалога, таким образом весь диалог будет полностью переделан с нуля, когда вы вызовете его снова. Обратите внимание, что эта функция действует иначе, чем $ (this) .dialog (destroy); поскольку он только возвращает диалог в его состояние до инициализации, не разрушая объект. - person Jeff Noel; 26.07.2012

Я решил это.

Я использовал функцию уничтожения вместо функции закрытия (это не имеет никакого смысла), но она сработала.

$(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' });
});
person David Bonnici    schedule 14.12.2008
comment
Destroy будет работать, если вы используете этот метод, но для того, чтобы close () работал, сначала создайте экземпляр диалога, затем используйте dialog.show (), чтобы показать его, затем dialog.close (), чтобы закрыть его, и он снова откроется без проблем. . - person RaeLehman; 06.01.2009
comment
Почти. Вы правы в том, что сначала инициализируете его, но после этого это .dialog (open) и .dialog (close) - person rdworth; 07.01.2009

в последней строке не используйте $(this).remove(), используйте вместо этого $(this).hide().

РЕДАКТИРОВАТЬ: Чтобы уточнить, при закрытии события щелчка вы удаляете #terms div из DOM, поэтому он не возвращается. Вместо этого вам просто нужно скрыть это.

person Darko Z    schedule 14.12.2008

Я считаю, что вы можете инициализировать диалог только один раз. В приведенном выше примере выполняется попытка инициализации диалогового окна каждый раз при нажатии #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' });
});

Я думаю, что как только вы это проясните, он должен исправить описанную вами проблему «открытия по ссылке».

person 26design    schedule 27.10.2009

Для меня такой подход работает:

Диалог можно закрыть, щелкнув X в диалоговом окне или нажав «Bewaren». Я добавляю (произвольный) идентификатор, потому что мне нужно быть уверенным, что каждый бит 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();
               }
});
person Zilverdistel    schedule 25.05.2010

Это очень старая ветка, но поскольку в ответе даже говорится: «Это не имеет никакого смысла», я подумал, что добавлю ответ ...

Исходный пост использовал $ (this) .remove (); в обработчике закрытия это фактически удалит div диалога из DOM. Попытка снова инициализировать диалог не сработает, потому что div был удален.

Использование $ (this) .dialog ('destroy') вызывает метод destroy, определенный в объекте диалога, который не удаляет его из DOM.

Из документации:

разрушать()

Полностью удаляет функциональность диалога. Это вернет элемент обратно в его >> состояние до инициализации. Этот метод не принимает никаких аргументов.

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

person crad    schedule 23.10.2013

$(this).dialog('destroy');

работает!

person Benedikt    schedule 13.04.2009

.close () является более общим и может использоваться по отношению к большему количеству объектов. .dialog ('close') можно использовать только с диалогами

person John    schedule 28.01.2010

Я использую диалог как браузер и загрузчик диалоговых файлов, а затем переписываю код следующим образом

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

вроде все отлично работает.

person edib    schedule 27.09.2010

У меня была такая же проблема с диалоговым окном наложения 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);
        }
    });

  }

}

и все работает нормально

надеюсь, это кому-то поможет

O.

person Oleg Ivanov    schedule 06.06.2011

В документации jQuery есть ссылка на эту статью 'Базовое использование диалогового окна jQuery UI", в котором объясняется эта ситуация и способы ее решения.

person Barka    schedule 12.04.2010