Twitter 引导模式背景不会消失

Posted

技术标签:

【中文标题】Twitter 引导模式背景不会消失【英文标题】:Twitter bootstrap modal-backdrop doesn't disappear 【发布时间】:2012-07-16 04:57:54 【问题描述】:

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

我能做什么?

【问题讨论】:

你在使用$('#myModal').modal('hide')吗?你能在这里放一些代码吗? 如果您使用从 getboostrap 站点本身复制并粘贴到 html 生成的选择器中,请确保删除注释“”。 Bootstrap 感到困惑,并认为评论是第二个模态元素。它为这个“第二个”元素创建了另一个背景。 @Jordan:您的评论必须是一个答案!就我而言,您的评论是正确的解决方案! 参考以下:***.com/questions/22207377/… 我知道这个问题很老了,但是今天我有一个类似的问题,在我的情况下,有一个错误删除了“modal-lg”类,这只是为了“modal”造成混乱当您要使用键盘关闭模式时/单击外面的某个地方。 【参考方案1】:

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

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

$('#your-modal-id').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();

【讨论】:

如果可以的话,我会给这个答案+2。刚刚节省了我几个小时! 如果您需要评估 AJAX 响应并相应地更新模式,则在 AJAX 调用之前隐藏模式是一个糟糕的解决方案。 我相信这也可能是在淡入淡出动画完全完成之前调用 modal('hide') 引起的。从模式中删除淡入淡出类可能会有所帮助。 $('.modal-backdrop').remove();为我解决了,不需要删除淡入淡出类 $('.modal-backdrop').remove() 似乎会破坏未来模式的正常打开。【参考方案2】:

确保您为应用模态行为而对$.modal() 的初始调用未传入比您预期更多的元素。如果发生这种情况,它将最终为集合中的每个元素创建一个带有背景元素的模态实例。因此,当您实际上正在查看其中一个副本时,它可能看起来像是被遗忘了背景。

在我的例子中,我尝试使用如下代码即时创建模态内容:

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

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

【讨论】:

这家伙很赚钱。我从使用 $.html() 获得的模态中删除了 cmets,它现在可以工作了。怪怪的。 这也是我的问题。 愚蠢的引导程序!他们自己的示例标记(在开始和结束时使用 cmets)打破了这种范式。删除评论,它的工作原理! 这里也一样。删除 cmets 解决了这个问题。就一个问题。我看到模态完美地工作而无需使用 $('body').append(myModal) 将其添加到 DOM。是否需要将模态添加到页面 DOM 中? 我的标签不匹配。结果相同。谢谢!【参考方案3】:

我只是在这个问题上花了太长时间:)

虽然提供的其他答案很有帮助且有效,但从 Bootstrap 有效地重新创建模态隐藏功能对我来说似乎有点混乱,所以我找到了一个更简洁的解决方案。

问题是调用时会发生一连串的事件

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

当您随后替换一堆 HTML 作为 AJAX 请求的结果时,模式隐藏事件不会完成。但是,当一切完成时,Bootstrap 会触发一个事件,您可以像这样挂钩:

$("#myModal").modal('hide').on('hidden.bs.modal', functionThatEndsUpDestroyingTheDOM);

希望对您有所帮助!

【讨论】:

我也花了太长时间!这个答案给了我线索 - 有些东西正在破坏我的 DOM(角度)。查看引导代码,您可以通过首先删除淡入淡出类来强制立即删除背景:$('#myModal').removeClass('fade');$(myModal').modal('hide')' 应该是公认的答案 - 它按预期使用引导 API,并且不会使用 .modal-open 破解正文 这是最勤勉尽责的回答。 很好的答案,我的问题也是由于 ajax 调用替换了 dom - 我猜 modal('hide') 返回自身或模态引用,因此我们可以附加到 'hidden.bs.modal' ? 声明 模态隐藏事件未完成 让我知道了如何开始我的工作【参考方案4】:

在您的操作按钮中插入:

data-backdrop="false"

data-dismiss="modal" 

示例:

<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>

如果您输入此数据属性,.modal-backdrop 将不会出现。 有关此链接的文档:http://getbootstrap.com/javascript/#modals-usage

【讨论】:

这是一个真实的答案。在任何情况下都不要尝试手动执行 Bootstrap 打算做的事情。如果那将是您的解决方案,那么您的实施是错误的。我认为引导站点上的样板 HTML 有点不完整,这就是为什么许多人正在经历所描述的行为(包括我)。谢谢! +1 如果你不想从按钮触发模态怎么办? @ben 你错了。 data-backdrop="false" 只是一个告诉引导程序根本不要使用背景的选项。这与实际问题无关,它只是避免它。这就像说“我不会游泳,所以我不再进入游泳池”。这很酷,但你仍然不会游泳,如果你是老板把你扔到深水区,你会淹死的。在很多情况下都需要手动干预,例如 Angular 在应用后台踩踏 DOM 时。 这个 data-dismiss=modal 对我有帮助!接受的答案不允许您再次显示另一个模式,之后似乎被打破了 谢谢,我真的不想只为一个模态写js。在我看来,这应该是最重要的。【参考方案5】:

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

$('#myModal').trigger('click');

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

【讨论】:

这对我来说非常有效。在此处使用引导程序 4。 这应该是默认答案。谢谢 myModal 应该是什么?为什么它会关闭对话框?模态对话框只能通过单击关闭按钮或单击对话框外部来关闭。这似乎不是一个解决方案。 myModal 应该是什么? -> 它是主模态的 id。为什么它会关闭对话框? -> 之所以有效,是因为默认情况下,当您单击模态框外部时,动作会传播到其父级,并在那里进行处理。 是的!这应该是答案。【参考方案6】:

如果您使用从 getboostrap 站点本身复制并粘贴到 html 生成的选择器中,请确保删除注释“”。 Bootstrap 感到困惑,认为评论是第二个模态元素。它为这个“第二个”元素创建了另一个背景。

【讨论】:

我该死的……这正是我的问题。删除评论,它的工作。一个 HTML 评论到底是怎么绊倒 Bootstrap 的!? 我相信它正在寻找 html 元素来计数。由于 cmets 被视为元素,因此该计数与该注释有关。 在 Mustache 模板中有此文件时发生在我身上 注释存在于 DOM 中,以至于混淆了模态组件的 javascript 部分。我忘了具体是怎样的。这是不久前的事了。 Holy Moley - 这确实有效!这真是一个奇怪的错误。【参考方案7】:

我遇到了类似的问题:在我的模式窗口中,我有两个按钮,“取消”和“确定”。最初,两个按钮都会通过调用$('#myModal').modal('hide') 来关闭模态窗口(使用“OK”之前执行一些代码),场景如下:

    打开模态窗口 做一些操作,然后点击“确定”验证它们并关闭模态 再次打开模式并单击“取消”关闭 重新打开模式,再次点击“取消”==>背景不再可用!

好吧,我的隔壁同事拯救了我的一天:不要调用$('#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>

在我的 JavaScript 代码中,我有:

$("#modal-btn-ok").one("click", null, null, function()
    // My stuff to be done
);

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

希望这会有所帮助!

【讨论】:

这里也一样,如果不想从按钮触发模态怎么办?【参考方案8】:

如果您太快地隐藏然后再次显示模式窗口,也会出现此问题。这在其他地方提到过,但我将在下面提供更多详细信息。

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

如果这是您的问题的正确原因,这里有一些用于缓解问题的选项。选项 #1 是一种快速简便的测试,可以确定淡入淡出过渡时间是否确实是问题的原因。

    禁用模式的淡入淡出动画(从对话框中删除“淡入淡出”类) 更新模态文本而不是隐藏和重新显示它。 修复时间,使其在完成隐藏前一个模态之前不会显示模态。使用模式的事件来做到这一点。 http://getbootstrap.com/javascript/#modals-events

这里有一些相关的引导问题跟踪器帖子。跟踪帖子的数量可能比我在下面列出的要多。

https://github.com/twbs/bootstrap/issues/735 https://github.com/twbs/bootstrap/issues/2839 https://github.com/twbs/bootstrap/issues/19385

【讨论】:

【参考方案9】:

.modal('隐藏')

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

所以不是

$('#myModal').modal('hide');
$('#someOtherSelector').trigger('click');

$('#myModal').modal('hide');
$('#myModal').on('hidden.bs.modal', function() 
   $('#someOtherSelector').trigger('click');
);

所以你一定要等到“隐藏”事件完成。

【讨论】:

这绝对是一个更好的解决方案。这样您就不必弄乱模态类,这可能是解决此问题的更正确方法。【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

<button id="confirm-delete-btn" >Yes, Delete this note.</button>
<button id="confirm-delete-cancel" data-dismiss="modal">No</button>

我想执行一些 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 () 
        );

我触发了具有data-dismiss="modal" 属性的“否”按钮的点击事件。这有效:)

【讨论】:

手动触发点击事件不会为我关闭 IE9/IE10 中的模式。正在努力寻找解决方案。 没关系,问题有点不同 - 我在该按钮上附加了数据启用条件,虽然 IE 确实继续执行 onclick 事件,但它没有考虑数据关闭属性。 【参考方案12】:

使用:

$('.modal.in').modal('hide') 

Source

【讨论】:

【参考方案13】:

$('#myModal').trigger('click');

这对我有用。它不会关闭,因为当您打开弹出窗口时,它会触发 2 或 3 个模态背景。所以当你做 $('#myModal')).modal('hide');它只影响一个模态背景,其余部分仍然存在。

【讨论】:

【参考方案14】:

此解决方案适用于 Ruby on Rails 3.x 和一个 js.erb 文件,该文件可重建部分 DOM,包括模式。无论 ajax 调用来自模态还是来自页面的不同部分,它都能正常工作。

if ($("#my-modal").attr("aria-hidden") === "false") 
  $("#my-modal").modal('hide').on('hidden.bs.modal', function (event) 
    functionThatEndsUpDestroyingTheDOM();
  );
 else 
  functionThatEndsUpDestroyingTheDOM();

感谢@BillHuertas 提供的起点。

【讨论】:

【参考方案15】:

在我的模式中的任何按钮上添加data-dismiss="modal" 对我有用。我希望我的按钮调用一个带角度的函数来触发一个 ajax 调用并关闭模式,所以我在函数中添加了一个 .toggle() 并且它运行良好。 (在我的例子中,我使用了 bootstrap modal 并使用了一些 angular,而不是实际的模态控制器)。

<button type="button" class="btn btn-primary" data-dismiss="modal"
ng-click="functionName()"> Do Something </button>

$scope.functionName = function () 
angular.element('#modalId').toggle();
  $.ajax( ajax call )

【讨论】:

【参考方案16】:

应用最受好评的解决方案后,我遇到了一个问题,即它会破坏未来的模态正确打开。我发现我的解决方案效果很好

        element.on("shown.bs.modal", function () 
            if ($(".modal-backdrop").length > 1) 
                $(".modal-backdrop").not(':first').remove();
            
            element.css('display', 'block');
        );

【讨论】:

【参考方案17】:

更新面板问题。

我的问题是由于更新面板的位置。我在更新面板中有整个模式。如果您在更新面板之外声明模态并在更新面板中说模态体,那么 $('#myModalID').modal('hide'); 工作。

【讨论】:

这是我的问题。我有一个 AjaxManager 在包含整个模式的用户控件周围创建更新面板。我只在用户控件中留下了模态的主体,并在主页中移动了所有内容,一切都按预期开始工作,所以不要对你的 部分进行 ajaxify! 【参考方案18】:

这个问题的另一种观点。 (我使用的是 bootstrap.js 版本 3.3.6)

我错误地在javascript中手动初始化模态:

$('#myModal').modal(
   keyboard: false
)

并通过使用

data-toggle="modal"

在此按钮中,如下例所示(在文档中显示)

<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Launch demo modal</button>

所以结果它创建了两个实例

<div class="modal-backdrop fade in"></div>

打开模式时附加到我的 html 正文。这可能是使用函数关闭模式时的原因:

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

它只删除一个背景实例(如上所示),因此背景不会消失。但是如果你使用data-dismiss="modal" add on html,它确实会消失,如 bootstrap doc 中所示。

所以我的问题的解决方案是只在javascript中手动初始化模态而不使用数据属性,这样我既可以手动关闭模态也可以使用data-dismiss="modal"功能。

如果你遇到和我一样的问题,希望对你有所帮助。

【讨论】:

【参考方案19】:

仅供参考,以防有人遇到这种情况...我花了大约 3 个小时才发现最好的方法如下:

$("#my-modal").modal("hide");
$("#my-modal").hide();
$('.modal-backdrop').hide();
$("body").removeClass("modal-open");

那个关闭模态的功能很不直观。

【讨论】:

工作就像一个魅力。【参考方案20】:

在 .net MVC4 项目中,我在 Ajax.BeginForm(OnComplete = "addComplete" [删除额外代码]) 中弹出了模式 (bootstrap 3.0)。在“addComplete” javascript 中,我有以下代码。这解决了我的问题。

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

$("#moreLotDPModal").data('bs.modal').isShown = false;

$('body').removeClass('modal-open');

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

$('#moreLotDPModal').removeClass("in");

$('#moreLotDPModal').attr('aria-hidden', "true");

【讨论】:

我发现这个答案很有用。【参考方案21】:

我遇到了同样的问题。我发现这是由于 Bootstrap 和 JQueryUI 之间的冲突。

两者都使用“关闭”类。更改一个或另一个类可以解决此问题。

【讨论】:

【参考方案22】:

使用切换而不是隐藏,解决了我的问题

【讨论】:

分享一个可能的答案(示例)。这将有助于其他人很好地理解【参考方案23】:

确保您没有在其他地方使用相同的元素 ID/类,用于与模态组件无关的元素。

也就是说.. 如果您使用类名“myModal”来识别触发模式弹出窗口的按钮,请确保没有具有相同类名的不相关元素。

【讨论】:

【参考方案24】:

对我来说,最好的答案是这个。

<body>
<!-- All other HTML -->
<div>
    ...
</div>

<!-- Modal -->
<div class="modal fade" id="myModal">
    ...
</div>

模态标记放置 始终尝试将模态框的 HTML 代码放在文档中的***位置,以避免其他组件影响模态框的外观和/或功能。

来自SO answer

【讨论】:

【参考方案25】:

我在尝试提交表单时遇到了同样的问题。解决方案是将按钮类型从submit 更改为button,然后像这样处理按钮单击事件:

'click .js-save-modal' () 
    $('#myFormId').submit();
    $('#myModalId').modal('hide');

【讨论】:

【参考方案26】:

我也遇到了同样的问题。

但是我使用的是 bootbox.js,所以可能与此有关。

无论哪种方式,我都意识到问题是由具有与其父级相同类的元素引起的。当这些元素之一用于绑定点击功能以显示模态时,就会出现问题。

即这就是导致问题的原因:

<div class="myElement">
    <div class="myElement">
        Click here to show modal
    </div>
</div>

改变它,使被点击的元素与它的父元素、任何它的子元素或任何其他祖先都不具有相同的类。通常在绑定点击函数时这样做可能是一个好习惯。

【讨论】:

【参考方案27】:

我正在使用 Meteor,但我遇到了同样的问题。我的错误的原因是这样的:

#if tourmanager
    >contactInformation tourmanager
else
    <a href="#addArtistTourmanagerModal" data-toggle="modal"><i class="fa fa-plus"></i> Tourmanager toevoegen</a>
    >addArtistTourmanagerModal
/if

如您所见,我在 else 中添加了模态,因此当我的模态更新联系信息时,if 有另一个状态。这导致模态模板在关闭之前被排除在 DOM 之外。

解决方案:将模态移出 if-else:

#if tourmanager
    >contactInformation tourmanager
else
    <a href="#addArtistTourmanagerModal" data-toggle="modal"><i class="fa fa-plus"></i> Tourmanager toevoegen</a>
    >addArtistTourmanagerModal
/if

【讨论】:

【参考方案28】:
//Create modal appending on body
myModalBackup = null;
$('#myModal').on('hidden.bs.modal', function()
       $('body').append(myModalBackup.clone());
    myModalBackup = null;
);

//Destroy, clone and show modal
myModalBackup = $('#myModal').clone();
myModalBackup.find('.modal-backdrop').remove();
$('#myModal').modal('hide').remove();
myModalBackup.find('.info1').html('customize element <b>1</b>...');
myModalBackup.find('.info2').html('customize element <b>2</b>...');                             
myModalBackup.modal('show');

小提琴 --> https://jsfiddle.net/o6th7t1x/4/

【讨论】:

【参考方案29】:

data-backdrop属性的初始值可以是

“静态”、“真”、“假”。

statictrue 添加模态阴影,而 false 禁用阴影,因此您只需在第一次点击时更改此值为假。像这样:

$(document).on('ready',function()
	
	var count=0;
	
$('#id-which-triggers-modal').on('click',function()
		
		if(count>0)
		
			$(this).attr('data-backdrop','false')
		
		count++;
);


);

【讨论】:

【参考方案30】:

我遇到了模态背景屏幕冻结问题,但情况略有不同:当显示 2 个背靠背模态时。例如第一个会要求确认做某事,在单击“确认”按钮后,该操作会遇到错误,并且将显示第二个模式以弹出错误消息。第二个模态背景会冻结屏幕。 元素的类名或 id 没有冲突。

解决问题的方法是给浏览器足够的时间来处理模态背景。在点击“确认”后不要立即采取行动,而是让浏览器说 500 毫秒来隐藏第一个模式并清理背景等 - 然后采取最终会显示错误模式的操作。

<button type="button" class="btn btn-red" data-dismiss="modal" on-tap="_dialogConfirmed">Confirm</button>
...

_dialogConfirmed() 函数代码如下:

    var that = this;

    setTimeout(function () 
      if (that.confirmAction) 
        (that.confirmAction)();
        that.confirmAction = undefined;
      
    , 500);

我猜其他解决方案有效,因为它们花费了足够的额外时间,为浏览器提供了所需的清理时间。

【讨论】:

以上是关于Twitter 引导模式背景不会消失的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭 twitter 引导模式(初始启动后)

Twitter 引导模式输入字段焦点

Twitter 引导模式输入字段焦点

如何使 Twitter 引导模式全屏

jQuery datepicker 出现在 twitter 引导模式后面

当我们单击带有打印窗口的屏幕中的任意位置时,引导模式背景不会消失