jquery-ui-dialog - วิธีเชื่อมต่อกับเหตุการณ์ปิดไดอะล็อก


186

ฉันใช้jquery-ui-dialogปลั๊กอิน

ฉันกำลังมองหาวิธีรีเฟรชหน้าเมื่ออยู่ในบางสถานการณ์เมื่อปิดกล่องโต้ตอบ

มีวิธีในการจับภาพเหตุการณ์ปิดจากกล่องโต้ตอบหรือไม่?

ฉันรู้ว่าฉันสามารถเรียกใช้รหัสได้เมื่อคลิกปุ่มปิด แต่ไม่ครอบคลุมการปิดผู้ใช้ด้วยการยกเว้นหรือ x ที่มุมบนขวา

คำตอบ:


248

ฉันได้พบมัน!

คุณสามารถจับเหตุการณ์ปิดโดยใช้รหัสต่อไปนี้:

 $('div#popup_content').on('dialogclose', function(event) {
     alert('closed');
 });

เห็นได้ชัดว่าฉันสามารถแทนที่การแจ้งเตือนด้วยสิ่งที่ฉันต้องทำ
แก้ไข:ตั้งแต่วันที่ Jquery 1.7 การผูก () ได้กลายเป็น ()


3
ประเภท: $ ('div # popup_content'). ผูก ('dialogclose', ฟังก์ชัน (เหตุการณ์)) {... }
CFNinja

1
สิ่งนี้มีประโยชน์ แต่$('div#popup_content')ใช่มั้ย ฉันควรจะแทนที่สิ่งนี้ด้วยโปรดคำนึงถึงบทสนทนาของฉันที่เปิดอยู่เช่นนี้jQuery.fn.dialog.open({})
Jake N

ฉันเห็นกล่องโต้ตอบปิดลงก่อนจากนั้นการแจ้งเตือนจะปรากฏขึ้นหากเป็นสถานการณ์เดียวกันกับทุกคนสามารถมีคนช่วยฉันได้เพื่อให้การแจ้งเตือนปรากฏขึ้นก่อนจากนั้นคลิก OK แล้วหน้าต่างจะปิดลงหรือไม่ แก้ไขฉัน ....
changeme

5
ควรอัปเดตเพื่อใช้กับ () แทนการผูก () ซึ่งล้าสมัยแล้ว
RBZ

2
โปรดทราบว่าหาก jQuery UI Dialog ไม่เคยเปิดมาก่อนบนหน้าเว็บแล้วโอเวอร์เลย์ div จะไม่มีอยู่ใน DOM ดังนั้นคุณอาจพิจารณาทำอะไรเช่นนี้แทน:$('body').on('dialogclose', '.ui-dialog', function(){...});
thdoan

192

ฉันเชื่อว่าคุณสามารถทำได้ในขณะที่สร้างกล่องโต้ตอบ (คัดลอกมาจากโครงการที่ฉันทำ):

dialog = $('#dialog').dialog({
    modal: true,
    autoOpen: false,
    width: 700,
    height: 500,
    minWidth: 700,
    minHeight: 500,
    position: ["center", 200],
    close: CloseFunction,
    overlay: {
        opacity: 0.5,
        background: "black"
    }
});

บันทึก close: CloseFunction


9
คำตอบนี้ดูเหมือนถูกต้องมากกว่าคำตอบที่ฉันยอมรับ นอกจากนี้ยังพบเอกสาร API ที่ถูกต้องที่นี่: api.jqueryui.com/dialog/#event-close
Chris Gillum

2
Jake N - คุณต้องเขียนฟังก์ชั่นที่สามารถเข้าถึงไดอะล็อกที่เรียกว่า 'CloseFunction' เพื่อให้ใช้งานได้ตัวอย่างเช่นคุณสามารถเขียนได้ var CloseFunction = function() { //Do your custom closing stuff here };
Adam Diament

นี่เป็นตัวเลือก แต่ในเวลานั้นมีการใช้รหัสในที่ต่าง ๆ คำตอบที่เลือกใช้งานได้เมื่อคุณต้องการเพิ่มพฤติกรรมที่แตกต่างในบริบทที่แตกต่างกันและนำรหัสการสร้างไดอะล็อกกลับมาใช้ซ้ำเพื่อรับมาตรฐาน
NectarSoft

คุณมีoverlayสองครั้ง นั่นไม่จำเป็นเลยใช่มั้ย
radbyx

1
วิธีนี้ใช้ได้ผลและเป็นคำตอบที่จำเป็นและมีประโยชน์อย่างแน่นอนที่นี่ แต่มันยังเรียกใช้รหัส CloseFunction เมื่อใดก็ตามที่กล่องโต้ตอบถูกปิดด้วยวิธีการใด ๆ ไม่ใช่เฉพาะเมื่อปิดด้วย X หรืออะไรบางอย่าง ดังนั้นหากคุณต้องการรันโค้ดบางอย่างเมื่อปิดกล่องโต้ตอบด้วยปุ่ม X หรือปุ่ม Cancel แต่ไม่ใช่เมื่อมันถูกปิดโดยสิ่งอื่นเกิดขึ้น (เช่นในกรณีของฉันเมื่ออินพุตที่ส่งถูกตรวจสอบว่าถูกต้อง) สิ่งนี้จะไม่ งาน.
mikato

31
$("#dialog").dialog({
    autoOpen: false,
    resizable: false,
    width: 400,
    height: 140,
    modal: true, 
    buttons: {
        "SUBMIT": function() { 
        $("form").submit();
    }, 
        "CANCEL": function() { 
        $(this).dialog("close");
    } 
    },
    close: function() {
      alert('close');
    }
});

21
$( "#dialogueForm" ).dialog({
              autoOpen: false,
              height: "auto",
              width: "auto",
              modal: true,
                my: "center",
                at: "center",
                of: window,
              close : function(){
                  // functionality goes here
              }  
              });

คุณสมบัติ "ปิด" ของกล่องโต้ตอบช่วยให้เหตุการณ์ปิดเหมือนกัน


16

คุณสามารถลองสิ่งนี้ได้เช่นกัน

$("#dialog").dialog({
            autoOpen: false,
            resizable: true,
            height: 400,
            width: 150,
            position: 'center',
            title: 'Term Sheet',
            beforeClose: function(event, ui) { 
               console.log('Event Fire');
            },
            modal: true,
            buttons: {
                "Submit": function () {
                    $(this).dialog("close");
                },
                "Cancel": function () {
                    $(this).dialog("close");
                }
            }
        });

10

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน ...

$('#dialog').live("dialogclose", function(){
   //code to run on dialog close
});

8

ตั้งแต่ jQuery 1.7 เมธอด. on () เป็นวิธีที่ต้องการสำหรับการแนบตัวจัดการเหตุการณ์กับเอกสาร

เพราะไม่มีใครสร้างคำตอบจริงๆด้วยการใช้ on()แทนที่จะbind()ฉันตัดสินใจที่จะสร้าง

$('div#dialog').on('dialogclose', function(event) {
     //custom logic fired after dialog is closed.  
});

6

เพิ่มตัวเลือก 'ปิด' เช่นใต้ตัวอย่างและทำสิ่งที่คุณต้องการในฟังก์ชั่นอินไลน์

close: function(e){
    //do something
}

4

หากฉันเข้าใจประเภทของหน้าต่างที่คุณกำลังพูดถึงจะไม่$ (หน้าต่าง) .unload () (สำหรับหน้าต่างโต้ตอบ) มอบเบ็ดที่คุณต้องการหรือไม่

(และถ้าผมเข้าใจผิดและคุณกำลังพูดถึงกล่องโต้ตอบทำผ่านทาง CSS มากกว่าป๊อปอัพหน้าต่างเบราว์เซอร์แล้วทุกวิธีการปิดหน้าต่างที่เป็นองค์ประกอบคุณสามารถลงทะเบียนคลิก handers สำหรับ.)

แก้ไข:อ่าฉันเห็นแล้วว่าตอนนี้คุณกำลังพูดถึงกล่องโต้ตอบ jquery-ui ซึ่งทำผ่าน CSS คุณสามารถเบ็ดXซึ่งปิดหน้าต่างโดยการลงทะเบียนจัดการคลิกสำหรับองค์ประกอบที่มีระดับUI-โต้ตอบ titlebar อย่างใกล้ชิด

บางทีอาจมีประโยชน์มากกว่านี้คือคุณบอกวิธีคิดอย่างรวดเร็ว ขณะที่แสดงกล่องโต้ตอบให้เปิดป๊อปอัพ FireBug และตรวจสอบองค์ประกอบที่สามารถปิดหน้าต่างได้ คุณจะเห็นวิธีการกำหนดและให้สิ่งที่คุณต้องการในการลงทะเบียนตัวจัดการการคลิก

ดังนั้นเพื่อตอบคำถามของคุณโดยตรงฉันเชื่อว่าคำตอบคือ "ไม่" จริงๆ - ไม่มีเหตุการณ์ปิดที่คุณสามารถขอได้ แต่ "ใช่" - คุณสามารถขอทุกวิธีในการปิดกล่องโต้ตอบได้อย่างง่ายดายและรับ คุณต้องการอะไร.


เฮ้แอนดี้ ฉันสนุกโต้ตอบจาก jquery-ui ซึ่งทำผ่าน css และ javascript จากการดูรหัสฉันคิดว่ามีตะขออยู่ในนั้นสำหรับฉัน แต่ฉันไม่รู้จะไปได้อย่างไร
บราวนี่

2

คุณอาจลองใช้รหัสต่อไปนี้เพื่อจับภาพเหตุการณ์การปิดสำหรับรายการใด ๆ : หน้า, กล่องโต้ตอบ ฯลฯ

$("#dialog").live('pagehide', function(event, ui) {
      $(this).hide();
});

1
เพียงใช้. on () - แทน. live () หรือ.
ผูก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.