Диалоговое окно 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(); },
    }); 
});

Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
79
0
224 825
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

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

Ответ принят как подходящий

Я решил это.

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

$(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' });
});

Destroy будет работать, если вы используете этот метод, но для того, чтобы close () работал, сначала создайте экземпляр диалога, затем используйте dialog.show (), чтобы показать его, затем dialog.close (), чтобы закрыть его, и он снова откроется без проблем. .

RaeLehman 06.01.2009 18:28

Почти. Вы правы в том, что сначала инициализируете его, но после этого это .dialog ("open") и .dialog ("close")

rdworth 07.01.2009 07:27
$(this).dialog('destroy');

работает!

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

Это прекрасно работает. Документы пользовательского интерфейса jQuery здесь не очень понятны. Но идея о том, что функция dialog предназначена для инициализации, отображения и скрытия, имела для меня смысл. Спасибо.

Steve Cooper 21.06.2009 02:52

Если вы загружаете это диалоговое окно из HTML, который может динамически изменяться, очень неинтуитивно, почему он не работает. У кого-нибудь есть хорошие решения, которые можно применить в целом к ​​этим ситуациям?

Milimetric 18.08.2011 00:14

@Milimetric Вы всегда можете использовать $ (this) .remove (); функции в конце каждой из кнопок вашего диалога, таким образом весь диалог будет полностью переделан с нуля, когда вы вызовете его снова. Обратите внимание, что эта функция действует иначе, чем $ (this) .dialog ("destroy"); так как он только возвращает диалог в его состояние до инициализации, не разрушая объект.

Jeff Noel 26.07.2012 22:36

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

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

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

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

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

Диалог можно закрыть, щелкнув 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();
               }
});

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

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

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

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

  }

}

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

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

О.

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

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

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

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

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

destroy()

Removes the dialog functionality completely. This will return the element back to its >>pre-init state. This method does not accept any arguments.

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

Другие вопросы по теме