如何在关闭时完全删除对话框


133

当ajax操作失败时,我将创建一个带有错误的新div,然后将其显示为对话框。关闭对话框后,我想完全销毁并再次删除div。我怎样才能做到这一点?目前,我的代码如下所示:

$('<div>We failed</div>')
    .dialog(
    {
        title: 'Error',
        close: function(event, ui)
        {
            $(this).destroy().remove();
        }
    });

当我运行此对话框时,对话框会正确显示,但是当我关闭对话框时,该对话框在html(使用FireBug)中仍然可见。我在这里想念什么?我忘记了什么?

更新:刚刚注意到我的代码在Firebug控制台中给了我一个错误。

$(this).destroy不是函数

有人可以帮助我吗?

更新:如果我只是这样做$(this).remove(),则该项目将从html中删除。但是它是否已从DOM中完全删除?还是我还需要以某种方式首先调用该destroy函数?

Answers:


261
$(this).dialog('destroy').remove()

这将破坏对话框,然后从DOM中完全删除“托管”对话框的div


3
请谨慎使用FF和Firebug。它会崩溃。 code.google.com/p/fbug/issues/detail?id=6290我花了几个小时...弄清楚我的代码有什么问题。
Hendry H.

5
如果您使用的是DOM中的div(不是动态创建的),请使用.empty()。如果您再次在课程外填写内容,则可以重用它。
KoalaBear

2
@ HendryH。,Firefox 23.0和Firebug 1.11.4似乎不再是问题。
cjm 2013年

2
destroy必要吗?不会删除元素也会破坏对话框吗?
德鲁什卡


10

为什么要删除它?

如果要防止创建多个实例,请使用以下方法...

$('#myDialog') 
    .dialog( 
    { 
        title: 'Error', 
        close: function(event, ui) 
        { 
            $(this).dialog('close');
        } 
    }); 

当发生错误时,您应该...

$('#myDialog').html("Ooops.");
$('#myDialog').dialog('open');

我只是认为这样会更容易,因为根据我从ajax调用返回的内容,它将包含不同的内容。而且div不是像我在示例中显示的那样是静态的,而是由github.com/nje/jquery-tmpl插件呈现的。如果您有换掉对话框内容的好方法,我会很感兴趣的是:)
Svish 2010年

好吧,在我的示例中,我采用了一个非常简单的选项,即只将一个字符串与对话框div一起转储:$('#myDialog')。html(“ Ooops。”); 您也可以修改它,以更改对话框div中任何子控件的内容。
Fiona-myaccessible.website 2010年

这不是一个好方法,因为除非您特意覆盖它们,否则所有dialogOptions都将保留在#myDialog上。第二个对话框不应(总是)具有与第一个对话框相同的按钮,高度等。
米歇尔·科尼尔

8
$(dialogElement).empty();

$(dialogElement).remove();

这实际上修复了它


3

这对我有用

$('<div>We failed</div>')
    .dialog(
    {
        title: 'Error',
        close: function(event, ui)
        {
            $(this).dialog("close");
            $(this).remove();
        }
    });

干杯!

PS:我有一个类似的问题,上述方法解决了它。


2
您正在从close回调中调用close方法!jQuery UI足够聪明,可以防止出现这种情况所建议的无限循环,但是它仍然是多余的,而且我绝对不会认为它很优雅。
Elezar '16

在编写答案时,如果没有$(this).dialog("close");,该对话框将不会消失。jQuery有时很奇怪。
deb_

2

一个对我来说就像一个魅力的丑陋解决方案:

$("#mydialog").dialog(
    open: function(){
        $('div.ui-widget-overlay').hide();
        $("div.ui-dialog").not(':first').remove();
}
});

4
它的工作有点奇怪。您打开对话框并立即将其删除...
Dementic 2013年

1

你可以用

$(dialogElement).empty();    
$(dialogElement).remove();

0

我在所有js项目中都使用了此功能

您将其称为:hideAndResetModals(“#IdModalDialog”)

您定义是否:

function hideAndResetModals(modalID)
{
    $(modalID).modal('hide');
    clearValidation(modalID); //You implement it if you need it. If not, you can remote this line
    $(modalID).on('hidden.bs.modal', function () 
    {
        $(modalID).find('form').trigger('reset');  
    });
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.