Как удалить диалоги JQuery из DOM

Я столкнулся с ситуацией, когда мне нужно вручную удалить старые диалоги перед созданием новых. В другом потоке был предложен следующий метод:

$('.ui-dialog').empty().remove();

И я думаю, что это сработает, но у меня есть другие диалоги, которые я не хочу удалять из DOM, и я думаю, что этот метод избавит их всех. Проверка страницы с помощью Firebug показывает, что как только JQuery создает диалог из html, который вы предоставляете, он дает ему стандартные обертки div, все с одинаковыми классами. Это:

ui-dialog ui-widget ui-widget-content ui-corner-all  ui-draggable

Таким образом, они довольно общие, и трудно найти уникальную характеристику для внешних классов-оболочек, которые необходимо выполнить. Я пытаюсь найти способ удалить только диалоги, которые хочу удалить, и оставить остальные. Любые идеи?

Ответ 1

SELF-ОТВЕТ:

Итак, на основании ответа Филиппа на мой оригинальный вопрос я принял следующий подход, который работал:

При создании диалога обычно создается его на основе идентификатора, и как только JQuery создает диалог, этот html (с идентификатором) все еще находится под обертками. Чтобы убедиться, что я удаляю правильный диалог, я использовал JQuery has, например:

$('.ui-dialog:has(#' + $myDialogDiv.attr('id') + ')').empty().remove();

Это сначала очищает содержимое оболочки, а затем удаляет ее из DOM.

Спасибо Филиппу за идеи.

Ответ 2

Я знаю, что эта тема старая, но я недавно столкнулся с той же ситуацией. Для моего случая я динамически создаю диалоги и использую .load(). jQuery действительно делает дурацкий материал с DOM и вызывает у меня значительные проблемы. После закрытия в DOM не было ненужного "дерьма", а иногда и удаления диалогового окна. Я не смог удалить "div", который был внутри, потому что я фактически использую содержимое div для сохранения некоторой информации о состоянии. Я придумал следующий код и протестировал его ограниченным образом, чтобы убедиться, что он сработал. Кажется, он удаляет весь ненужный багаж, который оставил JQuery. Я даже тестировал его, открывая несколько окон и контролируя состояние DOM во время процесса, чтобы обеспечить правильное поддержание состояния каждого диалога. Я буду публиковать весь код здесь (за исключением загруженного диалога, который был не более чем div с некоторым кодом в нем.

    <html>
        <head>
            <link href="css/redmond/jquery-ui-1.8.1.custom.css" type="text/css" rel="stylesheet" media="screen" />
            <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
            <script src="js/jquery-ui-1.8.1.custom.min.js" type="text/javascript"></script>

            <script type="text/javascript">
                $(document).ready (function () {
                    $("#openDialog").click (function () {
                        $("<div></div>")
                            .load ("loadDialogTest.php")
                            .appendTo ($("#containingDiv"))
                            .dialog ({
                            autoOpen: 'false',
                            title: 'Test This!',
                            close: function () {
                                $(this).dialog ('destroy').remove ();
                            }
                        }).dialog ('open');
                    });
                });
            </script>
        </head>

        <body>
            <a href="#" id="openDialog">Open it</a>

            <div id="containingDiv">
            </div>
        </body>

    </html>

Ответ 3

Правильный способ $('#yourdialog').dialog('destroy').remove();, предполагающий, что ваш диалог имеет правильный идентификатор.

Ответ 4

Создайте массив в DOM ready и добавьте ссылки на нужные диалоги при их отображении. Затем, когда вы хотите удалить их, передайте массив в jQuery и вызовите remove()

Ответ 5

Почему бы вам не добавить специальный класс в закрытые диалоги. Поэтому, когда вы закрываете диалог, вызывайте:

thisDialog.addClass("olddialog");

Затем вы можете просто удалить их все, используя:

$(".olddialog").remove();

Ответ 6

ИЗМЕНИТЬ

Из других комментариев, которые вы сделали, вы сохранили содержимое, но не dialog.destroy просто вернете его в состояние pre-init, т.е. минус динамическая внешняя разметка?

вы могли бы дать им уникальный "dialogClass", когда вы их создадите, и ссылаетесь на них таким образом, или вы можете предоставить обратный вызов, который рекламирует идентификатор, или добавить идентификатор перед диалогом элемента.

Хотя лично я использую только один диалог на странице/просмотр и только reset содержимое по мере необходимости.