Twitter bootstrap模态背景不会消失

pag*_*tti 253 modal-dialog twitter-bootstrap

我正在使用Twitter引导模态对话框.当我单击bootstrap模式对话框的提交按钮时,它会发送一个AJAX请求.我的问题是模态背景不会消失."模态"对话框确实消失了,但是"模态背景"会在屏幕上创建不透明度

我能做什么?

Che*_*Fre 525

当您执行AJAX请求时,请确保您没有替换包含实际模态窗口的容器,因为当您尝试关闭它时,Bootstrap将无法找到对它的引用.在Ajax完整处理程序中删除模态然后替换数据.

如果这不起作用,您可以通过执行以下操作来强制它消失:

$('#your-modal-id').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();
Run Code Online (Sandbox Code Playgroud)

  • `$('.modal-backdrop').remove()`似乎打破了未来的模态正确打开. (33认同)
  • 我相信这也可以通过在淡入淡出动画完全完成之前调用模态('hide')来引起.从模态中删除淡入淡出类可能会有所帮助. (18认同)
  • 如果可以,会给出这个答案+2.刚救了我几个小时! (15认同)
  • 如果您需要评估AJAX响应并相应地更新模态,那么在AJAX调用之前隐藏模态是一个糟糕的解决方案. (9认同)
  • $("模式,背景")删除(); 为我解决了这个问题,无需删除淡入淡出类 (7认同)
  • 确保包含$('body').removeClass('modal-open'); 除此以外; 后台内容(我在模态完成其工作后由ajax更新)不会显示需要向下滚动的大数据的滚动条. (4认同)
  • 您通常可以通过重新排序javascript方法的流程来修复此问题,可能与模态"隐藏"事件结合使用.如果你正在为一个团队编写代码,那么最好尝试这个而不是"hack",因为当你以后返回代码时,没有什么可以绊倒的. (2认同)
  • 我正在使用bootstrap 3.0 RC 1,这个问题仍然存在.在隐藏/隐藏事件的情况下,我没有做任何事情,但这个问题仍然存在,并且上面的黑客对我有用... (2认同)
  • 实际上我是用`$('.modal-backdrop')来做的.fadeOut(150);`所以它看起来更好,谢谢! (2认同)
  • 对于第一行,`$('.modal').modal('hide');`也将起作用而不是`$('#your-modal-id').modal('hide');`,你不需要它的身份证. (2认同)
  • @CronasDeSe我的问题是由多次加载bootstrap引起的(多个html片段通过资产管道与bootstrap js依赖关系进行了调整),因此元素有重复的bootstrap事件.当我从页面片段中删除引导依赖项时,问题就消失了. (2认同)
  • @krock 请考虑将其发布为答案。它为我解决了这个问题。 (2认同)

gas*_*man 65

确保您$.modal()应用模态行为的初始调用不会传递超出预期的元素.如果发生这种情况,它将最终为集合中的EACH元素创建一个带有背景元素的模态实例.因此,看起来背景可能已被遗忘,实际上你正在查看其中一个副本.

就我而言,我试图使用这样的代码动态创建模态内容:

myModal = $('<div class="modal">...lots of HTML content here...</div><!-- end modal -->');
$('body').append(myModal);
myModal.modal();
Run Code Online (Sandbox Code Playgroud)

在这里,结束</div>标记之后的HTML注释意味着myModal实际上是两个元素的jQuery集合 - div和注释.他们两个都尽职尽责地变成了模态,每个都有自己的背景元素.当然,除了背景之外,评论所形成的模态是不可见的,所以当我关闭真实模态(div)时,它看起来就像是留下了背景.

  • 这家伙是钱.我从$ .html()获取的模态中删除了注释,现在它可以工作了.怪异的怪异. (16认同)
  • 愚蠢的引导!他们自己的示例标记(开头和结尾的注释)打破了这种范式.删除评论,它的工作原理! (6认同)
  • 这对我来说也是个问题. (2认同)

Bil*_*tas 50

我只是花了太长时间才解决这个问题:)

虽然提供的其他答案都是有用且有效的,但是我从Bootstrap中有效地重新创建模态隐藏功能似乎有点麻烦,所以我找到了一个更清晰的解决方案.

问题是当你打电话时会发生一系列事件

$("#myModal").modal('hide');
functionThatEndsUpDestroyingTheDOM()
Run Code Online (Sandbox Code Playgroud)

当您因为AJAX请求而替换一堆HTML时,模态隐藏事件无法完成.但是,当一切都完成时,Bootstrap会触发一个事件,你可以像这样挂钩:

$("#myModal").modal('hide').on('hidden.bs.modal', functionThatEndsUpDestroyingTheDOM);
Run Code Online (Sandbox Code Playgroud)

希望这有用!

  • 我也花了太长时间!这个答案给了我一些线索 - 有些东西正在破坏我的DOM(角度).查看引导代码,你可以通过先删除淡入淡出类来强制立即删除背景:```$('#myModal').removeClass('fade'); $(myModal').modal( '隐藏')"``` (15认同)

kam*_*don 31

在您的操作按钮中插入:

data-backdrop="false"
Run Code Online (Sandbox Code Playgroud)

data-dismiss="modal" 
Run Code Online (Sandbox Code Playgroud)

例:

<button type="button" class="btn btn-default" data-dismiss="modal">Done</button>

<button type="button" class="btn btn-danger danger" data-dismiss="modal" data-backdrop="false">Action</button>
Run Code Online (Sandbox Code Playgroud)

如果输入此data-attr,则不会显示.modal-backdrop.有关它的文档,请访问此链接:http://getbootstrap.com/javascript/#modals-usage

  • @ben你错了.`data-backdrop ="false"`只是一个选项告诉bootstrap**根本不使用背景**.这与实际问题无关,只是避免了它.这就像是说"我不能游泳,所以我不再进入游泳池".那很酷,但你仍然无法游泳,如果你是老板把你扔到最深处,你就会被淹死.在许多情况下需要手动干预,例如当Angular在应用程序的后台踩踏DOM时. (7认同)
  • 这是一个真实的答案.在任何情况下都不要尝试手动执行Bootstrap打算做的事情.如果这将是您的解决方案,那么您实施的错误.我认为bootstrap网站上的样板HTML有点不完整,这就是为什么许多人正在经历所描述的行为(包括我).谢谢!+1 (2认同)
  • 如果您不希望通过按钮触发模态怎么办? (2认同)

Jor*_*dan 18

如果您使用getboostrap网站本身的副本并粘贴到html生成的选择器中,请确保删除注释"<! - /.modal - >".Bootstrap感到困惑,并认为评论是第二个模态元素.它为这个"第二"元素创建了另一个后退.


Cha*_*hal 10

我知道这是一个非常老的帖子,但这可能会有所帮助。这对我来说是一个很小的解决方法

$('#myModal').trigger('click');
Run Code Online (Sandbox Code Playgroud)

就是这样,这应该可以解决问题

  • 这应该是默认答案。谢谢 (3认同)
  • 这对我来说非常有效。在这里使用引导程序 4。 (2认同)

小智 9

我遇到了类似的问题:在我的模态窗口中,我有两个按钮,"取消"和"确定".最初,两个按钮都会通过调用$('#myModal').modal('hide')("OK"以前执行某些代码)关闭模态窗口,方案如下:

  1. 打开模态窗口
  2. 做一些操作,然后点击"确定"确认它们并关闭模态
  3. 再次打开模态并单击"取消"关闭
  4. 重新打开模态,再次单击"取消"==>背景不再可访问!

好吧,我的下一个桌子保存了我的一天:不是调用$('#myModal').modal('hide'),而是给你的按钮属性,data-dismiss="modal"并在你的"提交"按钮中添加一个"点击"事件.在我的问题中,按钮的HTML(好吧,TWIG)代码是:

<button id="modal-btn-ok" class="btn" data-dismiss="modal">OK</button>
<button id="modal-btn-cancel" class="btn" data-dismiss="modal">Cancel</button>
Run Code Online (Sandbox Code Playgroud)

在我的JavaScript代码中,我有:

$("#modal-btn-ok").one("click", null, null, function(){
    // My stuff to be done
});
Run Code Online (Sandbox Code Playgroud)

没有"点击"事件归因于"取消"按钮.模态现在正确关闭,让我再次使用"普通"页面播放.它实际上似乎data-dismiss="modal"应该是指示按钮(或任何DOM元素)应该关闭Bootstrap模式的唯一方法.该.modal('hide')方法似乎表现得不太可控.

希望这可以帮助!


Mar*_*rra 9

如果您隐藏然后再次显示模式窗口太快,也会发生此问题.这在其他地方提到了问题,但我将在下面提供更多细节.

问题与时间和淡入淡出过渡有关.如果您在前一个模态的淡出过渡完成之前显示模态,您将看到此持续背景问题(模态背景将保留在屏幕上,以您的方式).Bootstrap明确地不支持多个同时模态,但即使您隐藏的模态和您显示的模态相同,这似乎也是一个问题.

如果这是您的问题的正确原因,这里有一些减轻问题的选项.选项#1是一个快速简便的测试,用于确定淡入淡出转换时间是否确实是导致问题的原因.

  1. 禁用模态的淡入淡出动画(从对话框中删除"淡入淡出"类)
  2. 更新模态的文本而不是隐藏和重新显示它.
  3. 修复时间,使其在隐藏上一个模态之前不会显示模态.使用模态的事件来执行此操作.http://getbootstrap.com/javascript/#modals-events

以下是一些相关的bootstrap问题跟踪器帖子.可能会有比我下面列出的更多跟踪器帖子.


Hel*_*mut 8

.modal( '隐藏')

手动隐藏模态.在模态实际被隐藏之前(即在hidden.bs.modal事件发生之前)返回调用者.

而不是

$('#myModal').modal('hide');
$('#someOtherSelector').trigger('click');
Run Code Online (Sandbox Code Playgroud)

$('#myModal').modal('hide');
$('#myModal').on('hidden.bs.modal', function() {
   $('#someOtherSelector').trigger('click');
});
Run Code Online (Sandbox Code Playgroud)

因此,您一定要等到"隐藏"事件结束.


Web*_*nan 7

另一个可能导致此问题的错误,

确保您没有bootstrap.js在页面中多次包含脚本!


Yas*_*ser 5

即使我遇到类似的问题,我有以下两个按钮

<button id="confirm-delete-btn" >Yes, Delete this note.</button>
<button id="confirm-delete-cancel" data-dismiss="modal">No</button>
Run Code Online (Sandbox Code Playgroud)

我想执行一些ajax操作,并且在ajax操作成功时关闭模态.所以这就是我所做的.

$.ajax({
        url: '/ABC/Delete/' + self.model.get("Id")
            , type: 'DELETE'
            , success: function () {                    
                setTimeout(function () {
                    self.$("#confirm-delete-cancel").trigger("click");
                }, 1200);
            }
            , error: function () {}
        });
Run Code Online (Sandbox Code Playgroud)

我触发了具有该data-dismiss="modal"属性的"否"按钮的单击事件.这工作:)


Jam*_*imi 5

使用:

$('.modal.in').modal('hide') 
Run Code Online (Sandbox Code Playgroud)

资源