Làm thế nào để loại bỏ hoàn toàn một hộp thoại đóng


133

Khi một thao tác ajax không thành công, tôi tạo một div mới với các lỗi và sau đó hiển thị nó dưới dạng một hộp thoại. Khi hộp thoại được đóng, tôi muốn hủy hoàn toàn và xóa div một lần nữa. Tôi có thể làm cái này như thế nào? Mã của tôi trông giống như thế này vào lúc này:

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

Khi tôi chạy nó, hộp thoại hiển thị chính xác, nhưng khi tôi đóng nó, hộp thoại vẫn hiển thị trong html (sử dụng FireBug). Tôi đang thiếu gì ở đây? Một cái gì đó tôi đã quên?

Cập nhật: Chỉ cần lưu ý rằng mã của tôi cung cấp cho tôi một lỗi trong bảng điều khiển firebird.

$ (this) .destroy không phải là một hàm

Bất cứ ai có thể giúp tôi ra?

Cập nhật: Nếu tôi chỉ làm $(this).remove()thay vào đó, mục sẽ bị xóa khỏi html. Nhưng nó có bị xóa hoàn toàn khỏi DOM không? Hay bằng cách nào đó tôi cũng cần phải gọi chức năng hủy đó trước?

Câu trả lời:


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

Điều này sẽ phá hủy hộp thoại và sau đó loại bỏ div đã "lưu trữ" hộp thoại hoàn toàn khỏi DOM


3
tuyệt vời khi sử dụng cái này với FF và với Fireorms đã mở. Nó sẽ sụp đổ. code.google.com/p/forms/issues/detail?id=6290 Tôi đã dành hàng giờ ... để tìm ra lỗi sai với mã của mình.
Hendry H.

5
Nếu bạn đang sử dụng div từ DOM, do đó không được tạo động, hãy sử dụng .empty(). Sau đó, bạn có thể sử dụng lại nó, nếu bạn điền lại nội dung.
KoalaBear

2
@HendryH., Điều đó dường như không còn là vấn đề với Firefox 23.0 và Fireorms 1.11.4.
cjm

2
destroycần thiết không? Không xóa phần tử cũng phá hủy hộp thoại?
Druska


10

Tại sao bạn muốn loại bỏ nó?

Nếu đó là để ngăn chặn nhiều trường hợp được tạo, thì chỉ cần sử dụng cách tiếp cận sau ...

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

Và khi xảy ra lỗi, bạn sẽ làm ...

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

Tôi chỉ nghĩ rằng nó sẽ dễ dàng hơn, vì nó sẽ chứa các nội dung khác nhau tùy thuộc vào những gì tôi nhận được từ một cuộc gọi ajax. Và cũng là div không tĩnh như tôi đã thể hiện trong ví dụ của mình nhưng được hiển thị bởi plugin github.com/nje/jquery-tmpl . Nếu bạn có một cách tốt để hoán đổi nội dung của hộp thoại, tôi sẽ rất thích nhìn thấy điều đó :)
Svish

Chà, trong ví dụ của tôi, tôi đã đi với tùy chọn cực kỳ đơn giản là chỉ cần bỏ một chuỗi bằng hộp thoại div: $ ('# myDialog'). Html ("Ooops."); Bạn cũng có thể sửa đổi điều này để thay đổi nội dung của bất kỳ điều khiển phụ nào trong div hộp thoại.
Fiona - myaccessible.website

Đây không phải là một cách tiếp cận tuyệt vời vì tất cả các hộp thoạiOptions sẽ vẫn còn trên #myDialog trừ khi bạn ghi đè chúng một cách cụ thể. Hộp thoại thứ hai không nên (luôn luôn) có cùng các nút, chiều cao, v.v. như hộp thoại đầu tiên.
Michiel Cornille

8
$(dialogElement).empty();

$(dialogElement).remove();

cái này sửa nó cho thật


3

Điều này làm việc cho tôi

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

Chúc mừng!

PS: Tôi đã có một vấn đề tương tự và cách tiếp cận ở trên đã giải quyết nó.


2
Bạn đang gọi phương thức đóng từ trong cuộc gọi lại gần! Giao diện người dùng jQuery đủ thông minh để ngăn chặn vòng lặp vô hạn được đề xuất bởi điều này, nhưng nó vẫn dư thừa và tôi chắc chắn sẽ không coi đó là thanh lịch.
Elezar

Tại thời điểm viết câu trả lời, không có $(this).dialog("close");, hộp thoại sẽ không biến mất. jQuery đôi khi rất kỳ lạ.
deb_ 26/8/2016

2

Một giải pháp xấu xí hoạt động như một cơ duyên đối với tôi:

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

4
loại lạ của nó làm việc ở tất cả. bạn mở hộp thoại và ngay lập tức xóa nó ...
Dementic


0

Tôi sử dụng chức năng này trong tất cả các dự án js của tôi

Bạn gọi nó là: hideAndResetModals ("# IdModalDialog")

Bạn xác định nếu:

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');  
    });
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.