วิธีลบกล่องโต้ตอบอย่างสมบูรณ์เมื่อปิด


134

เมื่อการดำเนินการ 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 อย่างสมบูรณ์หรือไม่? หรือฉันต้องเรียกใช้ฟังก์ชันการทำลายนั้นก่อนเช่นกัน?

คำตอบ:


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

การดำเนินการนี้จะทำลายกล่องโต้ตอบและลบ div ที่ "โฮสต์" กล่องโต้ตอบออกจาก DOM โดยสิ้นเชิง


3
ใช้ความระมัดระวังกับ FF และเมื่อเปิด Firebug มันจะผิดพลาด code.google.com/p/fbug/issues/detail?id=6290ฉันใช้เวลาหลายชั่วโมง ... เพื่อคิดว่าโค้ดของฉันผิดอะไร
Hendry H.

5
หากคุณกำลังใช้ div จาก DOM .empty()จึงไม่ได้สร้างแบบไดนามิกการใช้งาน จากนั้นคุณสามารถนำกลับมาใช้ใหม่ได้หากคุณเติมเนื้อหาอีกครั้งนอกหลักสูตร
KoalaBear

2
@HendryH. ดูเหมือนว่าจะไม่มีปัญหากับ Firefox 23.0 และ Firebug 1.11.4 อีกต่อไป
cjm

2
คือdestroyจำเป็น? การลบองค์ประกอบจะไม่ทำลายกล่องโต้ตอบหรือไม่
Druska


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

ในตัวอย่างของฉันฉันใช้ตัวเลือกที่ง่ายมากในการทิ้งสตริงโดยใช้ไดอะล็อก div: $ ('# myDialog'). html ("Ooops."); คุณสามารถแก้ไขเพื่อเปลี่ยนเนื้อหาของตัวควบคุมย่อยในไดอะล็อก div ได้เช่นกัน
Fiona - myaccessible.website

นี่ไม่ใช่วิธีการที่ดีเนื่องจากกล่องโต้ตอบตัวเลือกทั้งหมดจะยังคงอยู่ใน #myDialog เว้นแต่คุณจะแทนที่โดยเฉพาะ กล่องโต้ตอบที่สองไม่ควร (เสมอ) มีปุ่มความสูงและอื่น ๆ เหมือนกันกับอันแรก
Michiel Cornille


3

สิ่งนี้ใช้ได้ผลสำหรับฉัน

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

ไชโย!

PS:ฉันมีปัญหาที่ค่อนข้างคล้ายกันและวิธีการข้างต้นแก้ไขได้


2
คุณกำลังเรียกใช้วิธีการปิดจากภายในการโทรกลับอย่างใกล้ชิด! jQuery UI นั้นฉลาดพอที่จะป้องกันการวนซ้ำที่ไม่มีที่สิ้นสุดที่แนะนำโดยสิ่งนี้ แต่มันก็ยังคงซ้ำซ้อนและฉันจะไม่คิดว่ามันหรูหราแน่นอน
Elezar

ในขณะที่เขียนคำตอบหากไม่มี$(this).dialog("close");กล่องโต้ตอบก็จะไม่หายไป jQuery บางครั้งก็แปลกมาก
deb_

2

วิธีแก้ปัญหาที่น่าเกลียดซึ่งเป็นเสน่ห์สำหรับฉัน:

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

4
มันใช้งานได้แปลก ๆ คุณเปิดกล่องโต้ตอบและลบออกทันที ...
Rafael Herscovici


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');  
    });
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.