将功能绑定到Twitter Bootstrap Modal关闭


530

我在一个新项目上使用Twitter Bootstrap lib,我希望页面的一部分刷新并检索模态关闭时的最新json数据。我看不到文档中的任何地方,有人可以向我指出或提出解决方案。

使用记录方法的两个问题

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

我已经在模式上附加了“隐藏”类,因此它不会在页面加载时显示,因此会加载两次

即使我删除了hide类,并将元素ID设置为display:noneconsole.log("THE MODAL CLOSED");在我点击close时添加到上面的函数中,也没有任何反应。

Answers:


1137

引导程序3和4

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

引导程序3:getbootstrap.com/javascript/#modals-events

引导程序4:getbootstrap.com/docs/4.1/components/modal/#events

引导程序2.3.2

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

请参阅getbootstrap.com/2.3.2/javascript.html#modals→事件


1
这似乎可行,除了由于某种原因,将鼠标悬停在模式页脚中的按钮上时也会触发。该按钮是常规的提交按钮:<input type =“ submit” class =“ btn btn-info” value =“ Go” />任何想法如何在将鼠标悬停在其上时不让hide事件触发?或者,如何检测到它是由于悬停而发射的?顺便说一句:即使事件被触发,模式对话框也不会关闭。
盖伊

2
我没有在Bootstrap 3中看到这种行为,可以摆弄吗?
sp00n 2013年

7
这个答案可能应该提到hidden.bs.modal和hide.bs.modal之间的区别。CSS动画完成时会触发“隐藏”,但是在我的测试中,如果没有动画,则它永远不会触发(虽然可能只是一个错误)。如果您使用的是数据管理,则使用hide.bs.modal会更安全,因为它会在调用.modal('hide')时立即触发。 getbootstrap.com/javascript/#modals-usage-请参阅“事件”小节。
伊万·斯坦克纳

2
Bootstrap 3:当我单击标记为data-dismiss="modal"(如关闭按钮)的模态标签时,它可以工作,但是当我单击模态周围的黑色背景区域时,它不起作用。模式已被关闭,但只有刷新页面后才能重新打开它。我已经尝试了两次'hidden.bs.modal''hide.bs.modal'但都无济于事。
marquito

5
@marquito您可以做的(我所做的)是这样使用它:$('#myModal').modal({ backdrop: 'static', keyboard: false });这样,在单击灰色区域或按Esc键时,模态不会关闭。
aesede 2015年

123

引导程序4

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

有关工作示例,请参见此JSFiddle:

https://jsfiddle.net/6n7bg2c9/

请在此处查看文档的“模态事件”部分:

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


1
对于任何发现要实现此类回调的帖子的人,Bootstrap都有一个扩展模块,其中包括此功能以及用于动态创建对话框/警报/确认的许多其他有用功能:bootboxjs.com
jkriddle

@Ricardo Lima在下面的响应现在是监视jQuery / bootstrap中事件的正确方法
sbonami 2012年

@meatballs对于工作示例仍具有较高的投票权。尽管不赞成使用bind。
Stephen Patten 2013年

@ 100acrewood Dude,现在找到了!谢谢!回复:bootboxjs.com
Stephen Patten

46

Bootstrap 3开始(编辑:Bootstrap 4中仍然相同),有两个实例可以触发事件,它们是:

1. 模态“隐藏”事件开始时

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

2. 模态“隐藏”事件结束时

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

参考:http : //getbootstrap.com/javascript/#js-events


1
这帮助我修复了Bootstrap模态错误,该错误会在任何模态关闭时向主体添加15px的填充权。谢谢!
山姆·马来耶克

2
非常适合显示2个事件。像我这样的初学者最好注意,此事件必须置于触发事件的模式下方。
Lynnell Emmanuel Neri

18

代替“ live”,您需要使用“ on”事件,但将其分配给文档对象:

采用:

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

1
如果模态是动态添加的,这就是您必须执行的操作。节省了我很多时间。
迪伦·范德伯格

15
$(document.body).on('hidden.bs.modal', function () {
    $('#myModal').removeData('bs.modal')
});


4

引导程序4:

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

hide.bs.modal:调用hide实例方法后,立即触发此事件。

hidden.bs.modal:当向用户隐藏模式后,将触发此事件(将等待CSS转换完成)​​。


这种方式对BS3也有效。请参阅BS2(不建议使用)方式的可接受答案。
罗兰

3

我会这样做:

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

其余的已经由其他人编写。我还建议阅读文档:jquery-on方法


2

我已经看到了许多有关引导事件的答案,例如hide.bs.modal在模式关闭时触发的事件。

这些事件有一个问题:模式中的任何弹出窗口(弹出窗口,工具提示等)都将触发该事件。

当模式关闭时,还有另一种捕获事件的方法。

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

in模态打开时,Bootstrap使用该类。使用hidden事件非常重要,因为在触发in事件时仍会定义该类hide

由于IE8不支持Jquery :not()选择器,因此该解决方案在IE8中不起作用。


2

我遇到了一些与

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

您需要将其放置在页面底部,将其放置在顶部永远不会触发该事件。


确实。很好,您提到需要将其放置在触发事件的模式下方。
Lynnell Emmanuel Neri

我将定义比这更严格的规则。$("#myModal")调用jQuery选择器myModal时,DOM中必须存在ID为的HTML元素。因此,您可以将这段代码放在页面顶部,但放在一个$(document).on("ready", function(){ ... });(或在DOM中填充元素后调用的类似函数)内。
Andy Gee

0

如果您想在每个模式关闭时触发函数,则可以使用此方法,

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

因此,您无需每次都指定模式ID。

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.