首页 文章

Twitter引导模态背景不会消失

提问于
浏览
228

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

我能做什么?

30 回答

  • 0

    我有同样的问题 . 我发现这是由于Bootstrap和JQueryUI之间的冲突 .

    两者都使用“关闭”类 . 在一个或另一个中更改类修复此问题 .

  • 4

    $( '#myModal')触发器( '点击');

    这对我有用 . 它没有关闭,因为当你打开弹出窗口时它会触发2或3个模态背景 . 所以当你做$('#myModal')) . modal('hide');它只影响一个模态背景和休息 .

  • 3

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

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

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

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

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

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

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

  • 5

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

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

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

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

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

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

    希望这有用!

  • 0

    在您的操作按钮中插入:

    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>
    

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

  • 0

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

  • 64

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

    • 打开模态窗口

    • 做一些操作,然后点击"OK"确认它们并关闭模态

    • 再次打开模态并单击"Cancel"关闭

    • 重新打开模态,再次单击"Cancel" ==>背景不再可访问!

    好吧,我的下一个 table 保存了我的一天:不是调用 $('#myModal').modal('hide') ,而是给你的按钮属性 data-dismiss="modal" 并在"Submit"按钮上添加一个"click"事件 . 在我的问题中,按钮的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
    });
    

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

    希望这可以帮助!

  • 4

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

    $('#moreLotDPModal') . hide(); $(“#moreLotDPModal”) . data('bs.modal') . isShown = false; $( '主体')removeClass( '模式开') . $(“模式,背景”)删除(); $( '#moreLotDPModal')removeClass( “中”) . $('#moreLotDPModal') . attr('aria-hidden',“true”);

  • 0

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

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

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

    • 禁用模态的淡化动画(从对话框中删除"fade"类)

    • 更新模态的文本,而不是隐藏和重新显示它 .

    • 修正时间以便它赢得了't show the modal until it'完成隐藏前一个模态 . 使用模态的事件来执行此操作 . http://getbootstrap.com/javascript/#modals-events

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

  • 2

    .modal( '隐藏')

    手动隐藏模态 . Returns to the caller before the modal has actually been hidden (即在hidden.bs.modal事件发生之前) .

    而不是

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

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

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

  • 0

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

    <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" 属性的'No'按钮的click事件 . 这工作:)

  • 8

    使用:

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

    Source

  • 0

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

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

    多数民众赞成,这应该解决问题

  • 8

    这个解决方案适用于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的起点 .

  • 2

    updatepanel问题 .

    我的问题是由于更新面板的位置 . 我在updatepanel中有完整的模态 . 如果你在updatepanel之外声明模态并且只是在更新面板中说出模态体,那么就是$('#myModalID') . modal('hide');工作 .

  • 1

    另一个可能产生这个问题的错误,

    Make sure you didn't included bootstrap.js script more than once in your page!

  • 48

    对这个问题的另一种观点 . (我正在使用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');
    

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

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

    希望如果您遇到与我相同的问题,这将有所帮助 .

  • 2

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

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

    关闭模态的功能非常不直观 .

  • 30

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

  • 0

    对于与模态组件无关的元素,请确保您没有在其他地方使用相同的元素Id / class .

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

  • 0

    我有同样的问题 .

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

    无论哪种方式,我意识到这个问题是由一个元素与它的父类相同的类引起的 . 当其中一个元素用于绑定单击函数以显示模态时,则会出现问题 .

    即这是导致问题的原因:

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

    更改它,以便被单击的元素与其父级,任何子级或任何其他祖先不具有相同的类 . 在绑定点击函数时,通常可以这样做 .

  • 0

    我正在使用Meteor,我遇到了同样的问题 . 我的bug的原因是这样的:

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

    正如你所看到的,我在else中添加了模态,所以当我的模态更新了contactinformation时,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}}
    
  • 1
    //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/

  • 1

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

    “静态”,“真实”,“虚假” .

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

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

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

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

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

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

  • 477

    在ASP.NET中,在jquery命令后面的代码上添加UpdatePanel的更新 . 例:

    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "myModal", "$('#myModal').modal('hide');", true);
        upModal.Update();
    
  • 1

    来自https://github.com/twbs/bootstrap/issues/19385

    Modal的show / hide方法是异步的 . 因此,代码如:foo.modal(“hide”); bar.modal( “节目”);是无效的 . 在再次调用show或hide方法之前,您需要等待显示/隐藏实际完成(通过侦听显示/隐藏的事件;请参阅http://getbootstrap.com/javascript/#modals-events) .

    当我打开相同的模态两次太快时,我遇到了这个问题,所以一个简单的修复方法是检查它是否已经显示,然后再次显示:

    $('#modalTitle').text(...);
    $('#modalMessage').text(...);
    if($('#messageModal').is(':hidden')){
        $('#messageModal').modal('show');
    }
    
  • 0

    试试这个

    $('#something_clickable').on('click', function () {
      $("#my_modal").modal("hide");
      $("body").removeClass("modal-open");
      $('.modal-backdrop').remove();
     });
    

    这对我来说可以 .

  • 18

    我有类似的问题 . 我正在将Boostrap与Backbone结合使用,我正在捕获“Do it”按钮的点击,然后停止传播这些事件 . 奇怪的是,这使得模态消失了,但不是背景 . 如果我调用event.preventDefault()但不调用stopPropagation(),则一切正常 .

相关问题