ผูกฟังก์ชั่นกับ Twitter Bootstrap Modal Close


530

ฉันใช้ Twitter Bootstrap lib ในโครงการใหม่และฉันต้องการให้บางส่วนของหน้าเว็บทำการรีเฟรชและดึงข้อมูล json ล่าสุดเมื่อปิดการใช้งาน ฉันไม่เห็นสิ่งนี้ในเอกสารใด ๆ ใครสามารถชี้ให้ฉันหรือแนะนำวิธีแก้ปัญหา

ปัญหาสองประการเกี่ยวกับการใช้วิธีการที่ทำเป็นเอกสาร

 $('#my-modal').bind('hide', function () {
   // do something ...
 });

ฉันแนบคลาส "ซ่อน" กับโมดัลแล้วดังนั้นจึงไม่ปรากฏในการโหลดหน้าเพื่อที่จะโหลดสองครั้ง

แม้ว่าฉันจะลบคลาส hide และตั้งค่าองค์ประกอบ id display:noneและเพิ่มconsole.log("THE MODAL CLOSED");ไปยังฟังก์ชั่นด้านบนเมื่อฉันกดปิดไม่มีอะไรเกิดขึ้น

คำตอบ:


1138

Bootstrap 3 & 4

$('#myModal').on('hidden.bs.modal', function () {
    // do something…
});

Bootstrap 3: getbootstrap.com/javascript/#modals-events

Bootstrap 4: getbootstrap.com/docs/4.1/components/modal/#events

Bootstrap 2.3.2

$('#myModal').on('hidden', function () {
    // do something…
});

ดูที่getbootstrap.com/2.3.2/javascript.html#modals →กิจกรรม


1
สิ่งนี้ดูเหมือนว่าจะทำงานยกเว้นด้วยเหตุผลบางอย่างเมื่อวางเมาส์เหนือปุ่มในส่วนท้ายของ modal มันก็จะทำการยิงด้วย ปุ่มนี้เป็นปุ่มส่งปกติ: <input type = "submit" class = "btn btn-info" value = "Go" /> ความคิดใดที่จะไม่มีไฟซ่อนเหตุการณ์เมื่อวางเมาส์เหนือมัน? หรือฉันจะตรวจพบว่ามันถูกไล่ออกเพราะโฮเวอร์ได้อย่างไร BTW: แม้ว่าเหตุการณ์จะเริ่มต้นขึ้นกล่องโต้ตอบโมดอลก็ไม่ปิด
Guy

2
ฉันไม่เห็นพฤติกรรมนี้ด้วย Bootstrap 3 คุณสามารถทำซอได้ไหม?
sp00n

7
คำตอบนี้อาจพูดถึงความแตกต่างระหว่าง hidden.bs.modal และ hide.bs.modal ซ่อนจะถูกไล่ออกเมื่อภาพเคลื่อนไหว CSS เสร็จสมบูรณ์ แต่ในการทดสอบของฉันหากไม่มีภาพเคลื่อนไหวมันจะไม่เริ่มทำงานเลย (อาจเป็นข้อผิดพลาดก็ได้) หากคุณทำงานกับการจัดการข้อมูลมันอาจปลอดภัยกว่าถ้าใช้ hide.bs.modal แทนซึ่งจะถูกเรียกใช้ทันทีที่เรียกว่า. mod ('hide') getbootstrap.com/javascript/#modals-usage - ดูส่วนย่อยของเหตุการณ์
Evan Steinkerchner

2
Bootstrap 3: มันทำงานเมื่อฉันคลิกที่แท็กโมดัลที่ทำเครื่องหมายว่าdata-dismiss="modal"(เช่นปุ่มปิด) แต่มันไม่ทำงานเมื่อฉันคลิกที่พื้นที่พื้นหลังสีดำรอบ ๆ คำกริยา โมดัลถูกยกเลิก แต่ไม่สามารถเปิดได้อีกจนกว่าจะรีเฟรชหน้าเว็บ ฉันลองทั้งสองอย่าง'hidden.bs.modal'และ'hide.bs.modal'ไม่เป็นประโยชน์
marquito

5
@marquito สิ่งที่คุณสามารถทำได้ (สิ่งที่ฉันทำ) คือการใช้มันเช่นนี้: $('#myModal').modal({ backdrop: 'static', keyboard: false });วิธีการที่กิริยาจะไม่ปิดเมื่อคลิกที่พื้นที่สีเทาหรือเมื่อกดปุ่ม Esc
aesede

123

Bootstrap 4

$('#my-modal').on('hidden.bs.modal', function () {
  window.alert('hidden event fired!');
});

ดู JSFiddle นี้สำหรับตัวอย่างการทำงาน:

https://jsfiddle.net/6n7bg2c9/

ดูหัวข้อกิจกรรม Modal ของเอกสารที่นี่:

https://getbootstrap.com/docs/4.3/components/modal/#events


1
สำหรับทุกคนที่พบว่าโพสต์นี้มองในการดำเนินการประเภทนี้ติดต่อกลับมีการขยายไปยังโมดูลเงินทุนที่มีฟังก์ชั่นนี้เป็นอย่างดีเป็นจำนวนมากของฟังก์ชั่นที่เป็นประโยชน์อื่น ๆ สำหรับการสร้างแบบไดนามิกไดอะล็อก / แจ้งเตือน / ยืนยัน A: bootboxjs.com
jkriddle

@Ricardo Lima การตอบกลับด้านล่างเป็นวิธีที่ถูกต้องในการตรวจสอบเหตุการณ์ใน jQuery / bootstrap
sbonami

@meatballs ยังคงโหวตให้กับตัวอย่างการทำงาน .. ถึงแม้ว่าการผูกจะเลิกใช้แล้ว
Stephen Patten

@ 100acrewood Dude ตอนนี้เป็นการค้นหา! ขอบคุณ! Re: bootboxjs.com
Stephen Patten

46

การเริ่มBootstrap 3 ( แก้ไข:ยังคงเหมือนเดิมในBootstrap 4 ) มี 2 อินสแตนซ์ที่คุณสามารถเริ่มเหตุการณ์ได้โดย:

1. เมื่อเหตุการณ์ "mod" เริ่มขึ้น

$('#myModal').on('hide.bs.modal', function () { 
    console.log('Fired at start of hide event!');
});  

2. เมื่อ modal "hide" เหตุการณ์เสร็จสิ้น

$('#myModal').on('hidden.bs.modal', function () {
    console.log('Fired when hide event has finished!');
});

Ref: http://getbootstrap.com/javascript/#js-events


1
สิ่งนี้ช่วยให้ฉันแก้ไขข้อผิดพลาด Bootstrap modal ของฉันซึ่งจะเพิ่ม 15px ของการเติมเต็มไปทางขวาให้กับร่างกายเมื่อใกล้กับ modal ใด ๆ ขอบคุณ!
Sam Malayek

2
เหมาะสำหรับแสดงเหตุการณ์ 2 เหตุการณ์ ดีกว่าสำหรับผู้เริ่มต้นอย่างฉันที่จะต้องทราบว่าสิ่งนี้จะต้องวางไว้ด้านล่าง modal สำหรับกิจกรรม
Lynnell Emmanuel Neri

18

แทน "สด" คุณต้องใช้เหตุการณ์ "เปิด" แต่กำหนดให้กับวัตถุเอกสาร:

ใช้:

$(document).on('hidden.bs.modal', '#Control_id', function (event) {
// code to run on closing
});

1
นี่คือวิธีที่คุณต้องทำหากมีการเพิ่ม modal แบบไดนามิก ช่วยฉันทีหนึ่งครั้ง
Dylan Vander Berg


6

Bootstrap นำเสนอกิจกรรมที่คุณสามารถเชื่อมต่อกับ modalได้เช่นถ้าคุณต้องการเริ่มต้นเหตุการณ์เมื่อ modal เสร็จสิ้นการถูกซ่อนจากผู้ใช้คุณสามารถใช้ hidden.bs.modal eventsเช่นนี้

    /* hidden.bs.modal event example */
    $('#myModal').on('hidden.bs.modal', function () {
          window.alert('hidden event fired!');
    })

ตรวจสอบซอทำงานได้ที่นี่อ่านเพิ่มเติมเกี่ยวกับวิธีการโมดัลและกิจกรรมที่นี่ในเอกสาร


4

Bootstrap 4:

$('#myModal').on('hidden.bs.modal', function (e) {
   // call your method
})

hide.bs.modal : เหตุการณ์นี้เกิดขึ้นทันทีเมื่อมีการเรียกวิธีการซ่อนอินสแตนซ์

hidden.bs.modal : เหตุการณ์นี้เกิดขึ้นเมื่อ modal เสร็จสิ้นการซ่อนจากผู้ใช้ (จะรอให้การเปลี่ยน CSS เสร็จสมบูรณ์)


วิธีนี้ใช้ได้กับ BS3 ด้วย โปรดดูคำตอบที่ยอมรับสำหรับวิธี BS2 (คัดค้าน)
Roland

3

ฉันจะทำเช่นนี้:

$('body').on('hidden.bs.modal', '#myModal', function(){ //this call your method });

ส่วนที่เหลือเขียนโดยคนอื่นแล้ว ฉันยังแนะนำให้อ่านเอกสาร: วิธีการ jquery - on


2

ฉันเห็นคำตอบมากมายเกี่ยวกับกิจกรรมบู๊ตสแตรปเช่น hide.bs.modalที่ทำให้เกิดเมื่อ modal ปิด

มีปัญหากับกิจกรรมเหล่านั้น: ป๊อปอัปใด ๆ ในโมดอล (ป๊อปอัป, เคล็ดลับเครื่องมือ ฯลฯ ) จะทริกเกอร์เหตุการณ์นั้น

มีวิธีอื่นในการติดตามเหตุการณ์เมื่อมีการปิดคำกริยา

$(document).on('hidden','#modal:not(.in)', function(){} );

Bootstrap ใช้inคลาสเมื่อ modal เปิดอยู่ มันสำคัญมากที่จะใช้งานอีhiddenเวนต์เนื่องจากคลาสinยังคงถูกกำหนดไว้เมื่อมีการจัดอีเวนต์hideมีการทริกเกอร์

วิธีนี้จะไม่ทำงานใน IE8 เนื่องจาก IE8 ไม่รองรับ:not()ตัวเลือกJquery


2

ฉันมีปัญหาเดียวกันกับบางอย่าง

$('#myModal').on('hidden.bs.modal', function () {
// do something… })

คุณต้องวางสิ่งนี้ไว้ที่ด้านล่างของหน้าโดยวางไว้ที่ด้านบนสุดเพื่อไม่ให้เกิดเหตุการณ์


จริง เป็นเรื่องที่ดีที่คุณพูดถึงว่าจำเป็นจะต้องอยู่ที่ด้านล่างของคำกริยาเพื่อยิงเหตุการณ์
Lynnell Emmanuel Neri

ฉันจะกำหนดกฎให้แน่นกว่านี้เล็กน้อย เมื่อตัวเลือก jQuery $("#myModal")ถูกเรียกใช้องค์ประกอบ HTML ที่มี ID ของmyModalความต้องการที่จะมีอยู่ใน DOM ดังนั้นคุณสามารถมีรหัสนี้ที่ด้านบนของหน้า แต่วางไว้ภายใน$(document).on("ready", function(){ ... });(หรือฟังก์ชั่นที่คล้ายกันที่เรียกว่าหลังจากที่ DOM มีประชากรองค์ประกอบ)
Andy Gee

0

ถ้าคุณต้องการที่จะยิงฟังก์ชั่นในทุกปิด modal คุณสามารถใช้วิธีนี้

$(document).ready(function (){
    $('.modal').each(function (){
        $(this).on('hidden.bs.modal', function () {
            //fires when evey popup close. Ex. resetModal();
        });
    });
});

ดังนั้นคุณไม่จำเป็นต้องระบุรหัส modal ทุกครั้ง

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