如何从JavaScript中隐藏Bootstrap模态?
我已经阅读这里的post,Bootstrap网站,并疯狂Googlesearch – 但无法find我敢肯定的是一个简单的答案…
我有一个Bootstrap模式,我从一个link_to这样的助手打开:
<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal", class: "btn btn-primary"} %>
在我的ContactsController.create
操作中,我有创buildContact
代码,然后传递给create.js.erb
。 在create.js.erb
,我有一些error handling代码(混合使用ruby和javascript)。 如果一切顺利,我想closures模式。
这是我有麻烦的地方。 一切顺利的时候,我似乎无法排除模态。
我试过$('#myModal').modal('hide');
这没有效果。 我也试过$('#myModal').hide();
导致模式解散,但离开的背景。
有关如何closures模式和/或从create.js.erb
closures背景的create.js.erb
?
编辑
这是myModal的标记:
<div class="modal hide" id="myModal" > <div class="modal-header"> <a class="close" data-dismiss="modal">×</a> <h3>Add Contact</h3> <div id="errors_notification"> </div> </div> <div class="modal-body"> <%= form_for :contact, url: contacts_path, remote: true do |f| %> <%= f.text_field :first_name, placeholder: "first name" %> <%= f.text_field :last_name, placeholder: "last name" %> <br> <%= f.submit "Save", name: 'save', class: "btn btn-primary" %> <a class="close btn" data-dismiss="modal">Cancel</a> <% end %> </div> <div class="modal-footer"> </div> </div>
在浏览器窗口中打开模式,使用浏览器的控制台尝试
$('#myModal').modal('hide');
如果它工作(和模式closures),那么你知道你的closuresJavascript 不是正确的从服务器发送到浏览器。
如果它不起作用,那么你需要进一步调查客户端发生了什么事情。 例如,确保没有两个具有相同ID的元素。 例如,页面加载后第一次运行,但不是第二次?
浏览器的控制台:Firefox的firebug,Chrome或Safari的debugging控制台等
要closures自举模态,你可以将'隐藏'作为选项传给模态方法
$('#modal').modal('hide');
请看这里的工作小提琴
引导程序还提供了可以挂钩到模态function的事件,例如,如果要在模块完成对用户隐藏时触发事件,则可以使用hidden.bs.modal事件,您可以在这里阅读有关模态方法和事件的更多信息文档
如果上述方法的非工作,给你的closuresbutton,并点击closuresbutton。
我使用Bootstrap 3.4对于我来说这是行不通的
$('#myModal').modal('hide')
无奈之下,我做到了这一点:
$('#myModal').hide(); $('.modal-backdrop').hide();
也许这不是优雅的,但它的作品
我遇到了同样的错误,这行代码真的帮助我。
$("[data-dismiss=modal]").trigger({ type: "click" });
$('#modal').modal('hide'); //hide the modal $('body').removeClass('modal-open'); //modal-open class is added on body so it has to be removed $('.modal-backdrop').remove(); //need to remove div with modal-backdrop class
我遇到了我认为是类似的问题。 $('#myModal').modal('hide');
很可能会通过该function并击中线路
if (!this.isShown || e.isDefaultPrevented()) return
问题是即使显示模态并且值应该为真,值显示也可能是未定义的。 我已经稍微修改了引导代码以下
if (!(typeof this.isShown == 'undefined') && (!this.isShown || e.isDefaultPrevented())) return
这似乎解决了大部分问题。 如果背景仍然存在,您可以随时添加一个调用,以便在隐藏调用$('.modal-backdrop').remove();
后手动删除它$('.modal-backdrop').remove();
。 根本不理想,但工作。
我find了正确的解决scheme,您可以使用此代码
$('.close').click();
(引用Bootstrap 3),隐藏模式使用: $('#modal').modal('hide')
。 但是背景的原因(对我来说)是因为我在“隐藏”之前就销毁了模式的DOM。
为了解决这个问题,我用DOM去除链接隐藏的事件。 在我的情况下: this.render()
var $modal = $('#modal'); //when hidden $modal.on('hidden.bs.modal', function(e) { return this.render(); //DOM destroyer }); $modal.modal('hide'); //start hiding
“显示”callback发生后,我有更好的运气:
$('#myModal').on('shown', function () { $('#myModal').modal('hide'); })
这确保模块在hide()调用之前完成加载。
这里是文档: http : //getbootstrap.com/javascript/#modals-methods
这里是方法:$('#myModal')。modal('hide')
如果您需要打开几次不同内容的模式,我build议添加(在您主要的js):
$('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); });
所以你会清理下一个开放的内容,并避免一种caching
我遇到了同样的问题,经过一些实验,我发现了一个解决scheme。 在我的点击处理程序中,我需要停止事件冒泡,如下所示:
$("a.close").on("click", function(e){ $("#modal").modal("hide"); e.stopPropagation(); });
我们需要照顾事件冒泡。 需要添加一行代码
$("#savechanges").on("click", function (e) { $("#userModal").modal("hide"); e.stopPropagation(); //This line would take care of it });
我意识到这是一个古老的问题,但我发现这些都不是我真正想要的东西。 这似乎是由于在完成显示之前试图closures模态而引起的。
我的解决scheme是基于@ schoonie23的答案,但我不得不改变一些东西。
首先,我在脚本的顶部声明了一个全局variables:
<script> var closeModal = false; ...Other Code...
然后在我的模态代码:
$('#myModal').on('show.bs.modal', function (event) { ...Some Code... if (someReasonToHideModal) { closeModal = true; return; } ...Other Code...
然后这:(请注意名称'shown.bs.modal',指示模式已经完全显示,而不是show'触发show事件被调用时(我最初尝试只是'显示',但它没有工作。 )
$('#myModal').on('shown.bs.modal', function (event) { if (closeEditModal) { $('#myModal').modal('hide'); closeModal = false; } });
希望有一天能省下一些额外的研究。 在提出这个问题之前,我花了一些时间寻找解决scheme。
$('.modal-backdrop').hide(); // for black background $('body').removeClass('modal-open'); // For scroll run $('#modal').modal('hide');
我们发现,在调用我们的服务器代码和返回成功callback之间只有一点点的延迟。 如果我们在$("#myModal").on('hidden.bs.modal', function (e)
处理程序然后调用$("#myModal").modal("hide");
方法,浏览器将隐藏模式,然后调用服务器端代码。
再次,不优雅,但function。
function myFunc(){ $("#myModal").on('hidden.bs.modal', function (e) { // Invoke your server side code here. }); $("#myModal").modal("hide"); };
正如你所看到的,当myFunc
被调用时,它将隐藏模式,然后调用服务器端代码。
即使我有同样的问题。 这帮了我很多
$("[data-dismiss=modal]").trigger({ type: "click" });
最好的forms来隐藏和显示模式与引导它
//OPEND $('#ModalForm').modal('show'); //HIDE $('#ModalForm').modal('hide');
这是不好的做法,但你可以使用这种技术通过在javascript中调用closuresbutton来closures模式。 这将在3秒后closures模式。
<!DOCTYPE html> <html lang="en"> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="bootstrap/3.3.7/js/bootstrap.min.js"></script> <script> window.onload=function() { setInterval(function(){ $("#closemodal").click(); }, 3000); } </script> </head> <body> <div class="container"> <h2>Modal Example</h2> <!-- Trigger the modal with a button --> <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button> <!-- Modal --> <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">Modal Header</h4> </div> <div class="modal-body"> <p>Some text in the modal.</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal" id="closemodal">Close</button> </div> </div> </div> </div> </div> </body> </html>
$('#modal').modal('hide');
而且它的变体不适用于我,除非我在取消button上有data-dismiss="modal"
属性。 和你一样,我的需求是基于一些额外的逻辑可能closures/可能不closures,所以点击一个链接与data-dismiss="modal"
彻底不会。 我结束了一个隐藏的button与data-dismiss="modal"
,我可以编程方式调用点击处理程序,所以
<a id="hidden-cancel" class="hide" data-dismiss="modal"></a> <a class="close btn">Cancel</a>
然后在点击处理程序中取消,当你需要closures你可以拥有的模态
$('#hidden-cancel').click();