禁止关闭Twitter Bootstrap模态窗口


549

我正在使用Twitter Bootstrap创建模式窗口。默认行为是,如果您在模态区域之外单击,模态将自动关闭。我想禁用它-即在模态外部单击时不关闭模态窗口。

有人可以共享jQuery代码来执行此操作吗?


1
您可能有这样做的完全正当理由(可能还有很多其他理由)。但是,值得注意的是,一般而言,UX方面的考虑会对此提出建议-大多数用户希望单击模式之外的内容会将“以下”的内容带到“前”。
Trevor

32
@Trevor就像modal的相反。
Rawling 2014年

11
如果在后台有一个只有在用户首先登录时才能激活的页面,该怎么办?通过单击模式的“确定”按钮,用户将被重定向到登录页面。如果用户只能单击即可,这意味着用户可以跳过登录页面,而无需登录即可访问该页面。All Hell Break Loose
跳线rbk

5
@Trevor我没有任何证据支持您的主张。
1252748

当用户必须在模式中填写许多表单字段时,此功能很明智。如果用户不小心单击了模态之外,则所有输入的详细信息将丢失;那么他们将不得不重新激活模式并重新填写字段。此功能可以避免这种刺激。
mickmackusa

Answers:


692

我相信您要将背景值设置为static。如果要避免在使用Esc键时关闭窗口,则必须设置另一个值。

例:

<a data-controls-modal="your_div_id"
   data-backdrop="static"
   data-keyboard="false"
   href="#">

或者,如果您使用的是JavaScript:

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
});

7
@ user1296175实现此目标的最终代码是什么?我也想这样做
AlphaMale 2012年

4
谢谢@nobita,添加data-backdrop =“ static”可以解决问题!Twitter引导程序文档很差:(
Blue Smith

2
检查来自@@ Varun Chatterji的答案,并将其包括在您的模态定义中
Leandro

1
禁用单行js的所有模态的外部单击:$ .fn.modal.Constructor.DEFAULTS.backdrop ='static';
卢卡斯·里西斯

1
对于Angular用户:var modalInstance = $ modal.open({templateUrl:'modalTemplate.html',控制器:'modalController',背景:'static',});
亚历山大

310

只需将backdrop属性设置为即可'static'

$('#myModal').modal({
  backdrop: 'static',
  keyboard: true
})

您可能还希望将keyboard属性设置为,false因为这样可以防止通过按Esc键盘上的键来关闭模式。

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
})

myModal 是包含您的模式内容的div的ID。


6
是的,这是最干净,最简单的答案(因为它避免添加数据属性)。作为参考,backdropkeyboard提到他们的文档在这里下的选项部分。
Jesse Dupuy 2014年

是否应避免数据属性?请对此进行指导。

@GopalAggarwal:取决于您如何设置模态。如果将模态与多个锚定标签关联,则使用数据属性可能很有意义。但是,当每个标签只有一个模式时,我将使用脚本参数,其中每个行为都可以在一个地方看到。
2014年

7
还要避免模态显示立即通过显示:false
ClearCloud8

214

您还可以在模式定义本身中包括以下属性:

<div class="modal hide fade" data-keyboard="false" data-backdrop="static">

4
是的,这是最干净,最简单的答案(因为它可以通过添加数据属性来工作)。作为参考,此处在文档的“选项”部分中提到了背景和键盘。
floww

如果您在页面加载时启动模式,则这是删除其他关闭选项的最佳方法。
圣诞老人

46

如果您已经初始化了模态窗口,则可能需要使用来重置选项,$('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})以确保它将应用新选项。


1
这帮助了我。设置“背景:'静态'”后,用户仍然可以通过点击关闭模式;似乎是个错误,但这确实成功了!
奥马尔

7
现在:$('#modal')。removeData('bs.modal')。modal({backdrop:'static',keyboard:false});
D3VELOPER

34

重写Dialog的Bootstrap'hide'事件并停止其默认行为(以放置对话框)。

请参阅以下代码段:

   $('#yourDialogID').on('hide.bs.modal', function(e) {

       e.preventDefault();
   });

在我们的情况下,它工作正常。


2
那么,如何还原呢?
sertaconay

3
优雅。thx :)然后@sertaconay仅创建一个布尔变量(例如),将检查该变量以确定您是否要阻止默认值
Nimrod Yonatan Ben-Nes

1
打开

2
如果您想更好地控制模式何时可关闭以及何时不可以关闭,这是一个完美的解决方案。
Curos

33

是的,您可以这样做:

<div id="myModal"  tabindex="-1" role="dialog"
     aria-labelledby="myModalLabel"
     aria-hidden="true"
     data-backdrop="static"  data-keyboard="false">

这对于在html中声明模态且仅通过javascript打开的情况是完美的-即没有链接到它。谢谢!
hgolov '16

22

有点像@AymKdn的答案,但这将允许您更改选项而无需重新初始化模式。

$('#myModal').data('modal').options.keyboard = false;

或者,如果您需要执行多个选择,那么JavaScript with在这里很方便!

with ($('#myModal').data("modal").options) {
    backdrop = 'static';
    keyboard = false;
}

如果模态已经打开,则这些选项仅在下次打开模态时才生效。


stackoverflow.com/questions/16030448/…但是我不喜欢这种解决方案
Victor,

14

只需添加这两件事

data-backdrop="static" 
data-keyboard="false"

现在看起来像这样

<div class="modal fade bs-example-modal-sm" id="myModal" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">

它将禁用退出按钮,也将禁用单击并隐藏。


几年前提供了此建议。
mickmackusa

11

您可以通过将以下JavaScript添加到页面中来禁用背景的点击关闭行为,并将其设置为所有模式的默认行为(确保在加载jQuery和Bootstrap JS后执行该行为):

$(function() {
    $.fn.modal.Constructor.DEFAULTS.backdrop = 'static';
});

6

正如D3VELOPER所说,以下代码可以解决该问题:

$('#modal').removeData('bs.modal').modal({backdrop: 'static', keyboard: false});

我正在同时使用jquery和bootstrap,但是根本removeData('modal')不起作用。


4

我发现的最好的方法是将此代码添加到链接中

<!-- Link -->
<a href="#mdl" role="button"  data-backdrop="static" data-keyboard="false" data-toggle="modal" id_team="" ></a>
<-- Div -->
<div id="mdl" class="modal hide fade" tabindex="-1" role="dialog" data-keyboard="false" data-backdrop="static"></div>

2

如果有人从Google来这里试图弄清楚如何防止某人关闭模式,请不要忘记该模式右上方还有一个关闭按钮需要删除。

我用一些CSS来隐藏它:

#Modal .modal-header button.close {
    visibility: hidden;
}

注意,使用“ display:none;” 在创建模态时会被覆盖,所以不要使用它。


您还不能只从模式标题中删除按钮吗?
2015年

有时使用CSS而不是更改HTML会很有帮助。
画了

2

如果要有条件地禁用该backdrop click closing功能。您可以使用以下行在运行时将backdrop选项设置为static

引导程序v3.xx

jQuery('#MyModal').data('bs.modal').options.backdrop = 'static';

引导程序v2.xx

jQuery('#MyModal').data('modal').options.backdrop = 'static';

这样可以防止已经实例化的模型 backdrop关闭选项设置为false默认行为)的。


2

您可以使用以下代码行来设置模式弹出窗口的默认行为:

 $.fn.modal.prototype.constructor.Constructor.DEFAULTS.backdrop = 'static';

就像+1这种方法一样,我不希望所有模态都使用该选项。
tsohr'4

2

如今,这样做非常容易。只需添加:

data-backdrop="static" data-keyboard="false" 

在模态分频器中。


几年前在同一页面上提供了此建议。
mickmackusa

1

好吧,这是你们中某些人可能正在寻找的另一种解决方案(就像我以前一样。)

我的问题是类似的,当我装入内部的iframe时,模式框正在关闭,因此我必须禁用模式关闭,直到iframe完成加载,然后重新启用。

此处介绍的解决方案无法100%正常工作。

我的解决方案是这样的:

showLocationModal = function(loc){

    var is_loading = true;

    if(is_loading === true) {

        is_loading  = false;
        var $modal   = $('#locationModal');

        $modal.modal({show:true});

        // prevent Modal to close before the iframe is loaded
        $modal.on("hide", function (e) {
            if(is_loading !== true) {
                e.preventDefault();
                return false
            }
        });

        // populate Modal
        $modal.find('.modal-body iframe').hide().attr('src', location.link).load(function(){

            is_loading = true;
     });
}};

因此,我暂时禁止使用以下方式关闭Modal:

$modal.on("hide", function (e) {
    if(is_loading !== true) {
        e.preventDefault();
        return false
    }
});

但是var is_loading将在Iframe加载后重新启用关闭功能。


1
<button type="button" class="btn btn-info btn-md" id="myBtn3">Static 
Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal3" 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">Static Backdrop</h4>
    </div>
    <div class="modal-body">
      <p>You cannot click outside of this modal to close it.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-
      dismiss="modal">Close</button>
    </div>
   </div>
  </div>
</div>
   <script>
    $("#myBtn3").click(function(){
     $("#myModal3").modal({backdrop: "static"});
    });
   });
  </script>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.