323

我已经阅读了这里的帖子,Bootstrap 网站,并且疯狂地用谷歌搜索 - 但找不到我确定是一个简单的答案......

我有一个从 link_to 助手打开的 Bootstrap 模式,如下所示:

<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal",  class: "btn btn-primary"} %>

在我的ContactsController.create操作中,我有创建Contact然后传递给create.js.erb. 在create.js.erb中,我有一些错误处理代码(ruby 和 javascript 的混合)。如果一切顺利,我想关闭模态。

这就是我遇到麻烦的地方。当一切顺利时,我似乎无法关闭模态。

我试过$('#myModal').modal('hide');了,这没有效果。我也尝试过$('#myModal').hide();导致模态消失但离开背景的方法。

关于如何关闭模式和/或从内部消除背景的任何指导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>
4

25 回答 25

547

在浏览器窗口中打开模式,使用浏览器的控制台尝试

$('#myModal').modal('hide');

如果它有效(并且模式关闭),那么您知道您关闭的 Javascript没有正确地从服务器发送到浏览器。

如果它不起作用,那么您需要进一步调查客户端发生了什么。例如,确保没有两个元素具有相同的 id。例如,它在页面加载后第一次工作,但不是第二次?

浏览器的控制台:firefox的firebug,Chrome或Safari的调试控制台等。

于 2012-05-07T11:55:48.633 回答
83

要关闭引导模式,您可以将“隐藏”作为选项传递给模式方法,如下所示

$('#modal').modal('hide');

请在此处查看工作小提琴

bootstrap 还提供了可以挂钩到模态功能的事件,例如,如果您想在模态完成对用户隐藏时触发事件,您可以使用hidden.bs.modal事件,您可以在此处阅读有关模态方法和事件的更多信息文档

如果上述方法都不起作用,请为您的关闭按钮提供一个 ID 并触发点击关闭按钮。

于 2014-06-30T06:09:20.297 回答
62

使用引导程序隐藏和显示模式的最佳形式

// SHOW
$('#ModalForm').modal('show');
// HIDE
$('#ModalForm').modal('hide');
于 2016-09-09T04:08:35.077 回答
54

我使用 Bootstrap 3.4 对我来说这不起作用

$('#myModal').modal('hide')

无奈之下,我这样做了:

$('#myModal').hide();
$('.modal-backdrop').hide();

也许它不优雅,但它有效

于 2015-04-10T11:30:24.810 回答
47

我遇到了同样的错误,这行代码对我很有帮助。

$("[data-dismiss=modal]").trigger({ type: "click" });
于 2014-11-30T21:13:30.857 回答
28
$('#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
于 2017-01-02T09:35:32.027 回答
27

我找到了正确的解决方案,您可以使用此代码

$('.close').click(); 
于 2016-01-02T12:34:14.080 回答
11

我遇到了我认为是类似的问题。$('#myModal').modal('hide');很可能会通过该功能并达到目标

if (!this.isShown || e.isDefaultPrevented()) return

问题是即使显示模态并且值应该为真,isShown 的值也可能未定义。我已将引导代码稍微修改为以下

if (!(typeof this.isShown == 'undefined') && (!this.isShown || e.isDefaultPrevented())) return

这似乎在很大程度上解决了这个问题。如果背景仍然存在,您可以随时添加调用以在隐藏调用之后手动将其移除$('.modal-backdrop').remove();。一点也不理想,但确实有效。

于 2012-11-01T23:18:33.403 回答
11

(参考 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
于 2014-04-29T20:08:47.063 回答
10

在“显示的”回调发生后,我最好能拨打电话:

$('#myModal').on('shown', function () {
      $('#myModal').modal('hide');
})

这确保了在调用 hide() 之前完成了模式加载。

于 2014-07-17T16:31:18.043 回答
10

我们发现在调用我们的服务器代码和返回成功回调之间只有一点延迟。如果我们在处理程序中包装对服务器的调用$("#myModal").on('hidden.bs.modal', function (e),然后调用该$("#myModal").modal("hide");方法,浏览器将隐藏模式,然后调用服务器端代码。

再次,不优雅但实用。

 function myFunc(){
        $("#myModal").on('hidden.bs.modal', function (e) {
            // Invoke your server side code here.
        });
        $("#myModal").modal("hide");
 };

如您所见,当myFunc被调用时,它将隐藏模态,然后调用服务器端代码。

于 2016-09-16T18:28:31.680 回答
8

隐藏模态背景是有效的,但随后任何模态和背景的打开都不会像应有的那样隐藏。我发现这始终有效:

// SHOW
$('#myModal').modal('show')
$('.modal-backdrop').show();

// HIDE
$('#myModal').modal('hide');
$('.modal-backdrop').hide();
于 2020-11-19T15:49:40.420 回答
8

我使用了这个简单的代码:

$("#MyModal .close").click();
于 2019-05-11T12:06:50.377 回答
6

我遇到了同样的问题,经过一些实验,我找到了解决方案。在我的点击处理程序中,我需要阻止事件冒泡,如下所示:

$("a.close").on("click", function(e){
  $("#modal").modal("hide");
  e.stopPropagation();
});
于 2013-07-11T19:51:08.823 回答
6
$('.modal-backdrop').hide(); // for black background
$('body').removeClass('modal-open'); // For scroll run
$('#modal').modal('hide'); 
于 2016-06-06T12:36:07.200 回答
6

这是文档: http: //getbootstrap.com/javascript/#modals-methods

这是方法: $('#myModal').modal('hide')

如果您需要多次打开不同内容的模态,我建议添加(在您的主js中):

$('body').on('hidden.bs.modal', '.modal', function () {
      $(this).removeData('bs.modal');
    });

因此,您将为下一次打开清理内容并避免一种缓存

于 2015-11-06T17:07:44.603 回答
6

$('#modal').modal('hide');data-dismiss="modal"除非我在取消按钮上有一个属性,否则它的变体对我不起作用。像你一样,我的需求是可能关闭/可能不关闭基于一些额外的逻辑,所以点击一个链接data-dismiss="modal"完全不会做。我最终得到了一个隐藏按钮data-dismiss="modal",我可以通过它以编程方式调用点击处理程序,所以

<a id="hidden-cancel" class="hide" data-dismiss="modal"></a>
<a class="close btn">Cancel</a>

然后在单击处理程序中取消当您需要关闭您可以拥有的模式时

$('#hidden-cancel').click();
于 2017-02-27T17:34:36.880 回答
5

即使我有同样的问题。这对我帮助很大

$("[data-dismiss=modal]").trigger({ type: "click" });
于 2016-10-10T14:30:06.930 回答
3

我们需要处理事件冒泡。需要添加一行代码

$("#savechanges").on("click", function (e) {
        $("#userModal").modal("hide");
        e.stopPropagation(); //This line would take care of it
    });
于 2015-08-20T12:31:40.840 回答
3

我意识到这是一个老问题,但我发现这些都不是我真正想要的。这似乎是由于在显示完成之前试图关闭模式引起的。

我的解决方案基于@schoonie23 的回答,但我不得不改变一些事情。

首先,我在脚本顶部声明了一个全局变量:

<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”表示模态已完全显示,而不是在调用显示事件时触发的“显示”。(我最初只尝试了“显示”,但它不起作用。 )

$('#myModal').on('shown.bs.modal', function (event) {
    if (closeEditModal) {
        $('#myModal').modal('hide');
        closeModal = false;
    }
});

希望有一天这可以为某人节省额外的研究。在我想出这个之前,我花了一些时间寻找解决方案。

于 2016-03-19T00:40:39.487 回答
2

我使用了这段代码 -

使用淡出隐藏具有平滑效果的模态。

$('#myModal').fadeOut();

$('.modal-backdrop').fadeOut();

$('.modal-open').css({'overflow': 'visible'});
于 2019-05-09T19:28:13.947 回答
2

document.getElementById('closeButton').click(); // 添加一个 data-dismiss="modal" 属性到 modal 中的一个元素并给它这个 id

于 2020-05-04T20:49:58.843 回答
1

如果您在模态中使用 close 类,则以下内容将起作用。根据您的用例,如果有多个具有关闭类的模式,我通常建议仅过滤可见模式。

$('.close:visible').click();
于 2019-04-07T16:57:05.867 回答
0

有时

$('#myModal').modal('hide');
$('#myModal').hide();

没有完成工作,因此您需要将其添加到模态的页脚:

<button type="button" id="close_cred_modal" class="btn btn-secondary" data-dismiss="modal">Close</button>

然后添加此行以关闭模式

$('#close_cred_modal').click();
于 2022-01-18T09:23:40.213 回答
-1

这是不好的做法,但您可以使用此技术通过在 javascript 中调用关闭按钮来关闭模式。这将在 3 秒后关闭模式。

<!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="https://maxcdn.bootstrapcdn.com/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">&times;</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>
于 2016-10-07T07:26:49.287 回答