Twitter Bootstrapモーダルウィンドウが閉じないようにする


549

Twitterブートストラップを使用してモーダルウィンドウを作成しています。デフォルトの動作では、モーダル領域の外側をクリックすると、モーダルは自動的に閉じます。これを無効にしたいのですが、モーダルの外側をクリックしたときにモーダルウィンドウを閉じないでください。

これを行うために誰かがjQueryコードを共有できますか?


1
これには完全に正当な理由があるかもしれません(他にも多くの可能性があります)。ただし、一般に、UXの考慮事項はこれに対して助言することに注意する必要があります。ほとんどのユーザーは、モーダルをクリックするとコンテンツが「下」の「前面」に移動すると期待しています。
Trevor

32
@Trevorそれはモーダルの反対のようなものです。
ローリング、2014

11
ユーザーが最初にログインした場合にのみアクティブ化できるページがバックグラウンドにある場合はどうなりますか?モーダルの[OK]ボタンをクリックすると、ユーザーはログインページにリダイレクトされます。ユーザーが単にクリックアウトできる場合、これはユーザーがログインページをスキップし、ログインせずにページにアクセスすることを意味します。オールヘルブレイクルーズ
ジャンパーRBK '05 / 09/05

5
@Trevor私はあなたの主張を裏付ける証拠をまったく見ていません。
1252748 2014年

この機能は、ユーザーがモーダルの多くのフォームフィールドに入力する必要があるシナリオで役立ちます。ユーザーが誤ってモーダルの外側をクリックすると、入力した詳細がすべて失われます。次に、モーダルを再度アクティブにし、フィールドを再入力する必要があります。この機能はそのような苛立ちを避けます。
mickmackusa

回答:


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

4
@nobitaに感謝します。data-backdrop= "static"を追加するとうまくいきます!Twitterのブートストラップドキュメントは貧弱です:(
Blue Smith

2
@@ Varun Chatterjiからの回答を確認し、これをモーダル定義に含めてください
Leandro

1
jsの1行ですべてのモーダルの外部クリックを無効にします。$ .fn.modal.Constructor.DEFAULTS.backdrop = 'static';
Lukas Liesis、2015年

1
Angularユーザーの場合:var modalInstance = $ modal.open({templateUrl: 'modalTemplate.html'、controller: 'modalController'、backdrop: 'static'、});
Alexandr

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:モーダルの設定方法によって異なります。モーダルを複数のアンカータグに関連付ける場合、データ属性を使用することは意味があるかもしれません。ただし、タグごとにモーダルが1つしかない場合は、すべての動作が1か所に表示されるスクリプトパラメーターを使用します。
Nirmal 2014年

7
また、モーダル表示を回避するには、ショーですぐに渡します:false
ClearCloud8

214

これらの属性をモーダル定義自体に含めることもできます。

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

4
うん、これは最もクリーンでシンプルな答えです(データ属性を追加することで機能するため)。参考までに、背景とキーボードについては、ドキュメントの「オプション」セクションで説明しています。
floww

ページの読み込み時にモーダルを起動する場合、これが他の終了オプションを削除する最良の方法です。
サンタ2017年

46

モーダルウィンドウを既に初期化している場合は、オプションを$('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})にリセットして、新しいオプションが適用されることを確認してください。


1
これは私を助けました。「背景: '静的'」を設定した後でも、ユーザーはクリックでモーダルを閉じることができます。バグのように見えましたが、これでうまくいきました!
Omar

7
今のところ:$( '#modal')。removeData( 'bs.modal')。modal({backdrop: 'static'、keyboard:false});
D3VELOPER 2015

34

DialogのBootstrap 'hide'イベントをオーバーライドし、そのデフォルトの動作を停止します(ダイアログを破棄するため)。

以下のコードスニペットをご覧ください。

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

       e.preventDefault();
   });

私たちの場合は問題なく動作します。


2
次に、それを元に戻す方法は?
sertaconay 2015年

3
ただエレガント。thx :)そして、@ sertaconayはブール変数(たとえば)を作成するだけです。これは、uがデフォルトを回避するかどうかを決定するためにチェックされます
Nimrod Yonatan Ben-Nes

1
ここでモーダルが開かれた後に機能した唯一のオプション
Asked_io

2
これは、モーダルが閉じられるときと閉じられないときをより細かく制御したい場合に最適なソリューションです。
キュロス2017年

33

はい、次のようにできます。

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

これは、モーダルがhtmlで宣言され、JavaScriptでのみ開かれる場合に最適です。つまり、リンクがありません。ありがとう!
hgolov 2016年

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

これら2つを追加するだけです

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とブートストラップの両方を使用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年

HTMLを変更する代わりに、CSSを使用するほうが有益な場合があります。
2015年

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 2017

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.on("hide", function (e) {
    if(is_loading !== true) {
        e.preventDefault();
        return false
    }
});

しかし、iframeが読み込まれた後に閉じることを再び有効にするvar is_loadingです。


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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.