ブートストラップモーダルが開いているかどうかを確認する方法で、jquery validateを使用できるようにする方法


111

モーダルが開いている場合にのみ検証を行う必要があります。それは、モーダルを開いてから閉じると、モーダルを開くボタンを押したからです。jqueryの検証を行っているため機能しません。モーダルが却下されたために表示されます。

モーダルが開いている場合はjqueryを広告したいので、検証を行いますが、これは可能ですか?

<script>
$(document).ready(function(){

var validator =$('#form1').validate(
 {
  ignore: "",
  rules: {

usu_login: {
  required: true
},
usu_password: {
  required: true
},
usu_email: {
  required: true
},
usu_nombre1: {
  required: true
},
usu_apellido1: {
  required: true
},
usu_fecha_nac: {
  required: true
},
usu_cedula: {
  required: true
},
usu_telefono1: {
  required: true
},
rol_id: {
  required: true
},
dependencia_id: {
  required: true
},
  },

  highlight: function(element) {
$(element).closest('.grupo').addClass('has-error');
        if($(".tab-content").find("div.tab-pane.active:has(div.has-error)").length == 0)
        {
            $(".tab-content").find("div.tab-pane:hidden:has(div.has-error)").each(function(index, tab)
            {
                var id = $(tab).attr("id");

                $('a[href="#' + id + '"]').tab('show');
            });
        }
  },
  unhighlight: function(element) {
$(element).closest('.grupo').removeClass('has-error');
  }
 });

}); // end document.ready

</script>

回答:


183

@GregPettitが言及する競合状態を回避するために、以下を使用できます。

($("element").data('bs.modal') || {})._isShown    // Bootstrap 4
($("element").data('bs.modal') || {}).isShown     // Bootstrap <= 3

Twitter Bootstrap Modal-IsShownで説明されているとおり

モーダルがまだ開かれていない場合はを.data('bs.modal')返すundefinedため、|| {}- isShownは(偽の)値になりますundefined。あなたが厳密さを身につけているなら、人はそうすることができます($("element").data('bs.modal') || {isShown: false}).isShown


2
これには問題があり、モーダルが開いていない場合、$( "element")。data( 'bs.modal')から 'undefined'が返されます
Flezcano

._isShownは私のために働いた、私はブートストラップ4アルファを使用している
Iftikar Urrhman Khan

8
Bootstrap 4では、_isShownではなくisShownです。
elquimista 2017

私はモーダルに「表示」クラス(ブートストラップ4)があるかどうかを確認しています-必要に応じて機能します。何らかの方法で_isShownをチェックする方が良いですか?
trainoasis

typescriptでソリューションを共有していただけませんか?
Surajit Biswas

80

使用できます

$('#myModal').hasClass('in');

ブートストラップは、inモーダルが開いているときにクラスを追加し、閉じているときにクラスを削除します


4
これは、フェードオプションと高速クリック、またはAjax呼び出しを介したモーダルのトリガーにより、少し壊れやすいことがわかります。フェードの時間遅延により、競合状態が発生する可能性があります。それでも、コンテンツが静的で、ユーザーの操作中にのみモデルがポップアップするときに、それにフックする便利な方法です!
Greg Pettit

ブートストラップモーダルの競合状態を回避する最も安全で確実な方法は、そのshown.bs.modalまたはhidden.bs.modalイベントをサブスクライブすることです。こうすることで、イベントコードが制御を取得したときに、ダイアログが不快な状態になっていないことを確信できます。
エリックロイド

Bootstrapバージョン4で有効ですか?
Mahdi Alkhatib 2017

1
@MahdiAlkhatibありませんが、これはあなたが置き換えることができますブートストラップ4に動作しない'in''show'ブートストラップ4のために
フィリップ・ストラットフォード

61

jQueryを直接使用することもできます。

$('#myModal').is(':visible');

1
答えが単純なときのように。ajaxを使用している場合は、onbeforeでこれを使用し、チェックしてfalseを返します。これにより、サーバーへの複数の呼び出しも防止されます。ありがとう!
eaglei22

受け入れられた回答は未定義またはnullを返しました。これは完璧に機能しました。ありがとう!
アレックス

8

モーダルが開いているかどうかを確認する

$('.modal:visible').length && $('body').hasClass('modal-open')

イベントリスナーをアタッチするには

$(document).on('show.bs.modal', '.modal', function () {
    // run your validation... ( or shown.bs.modal )
});

6

ブートストラップ2、3チェックは、ページで開いているモーダルです。

if($('.modal.in').length)

互換バージョンBootstrap 2、3、4+

if($('.modal.in, .modal.show').length)

ブートストラップのみ4+

if($('.modal.show').length)

3
私はBootstrap 4.1.3を使用しており、のshow代わりにクラスを追加していますin
Arif Hussain

4
$("element").data('bs.modal').isShown

モーダルが以前に表示されていない場合は機能しません。条件を追加する必要があります:

$("element").data('bs.modal')

したがって、最初の出現を考慮した答え:

if ($("element").data('bs.modal') && $("element").data('bs.modal').isShown){
... 
}



0

以下のような単純なjQueryを使用して実行できるのに、なぜ複雑なのか。

$('#myModal').on('shown.bs.modal', function (e) {
    console.log('myModal is shown');
    // Your actual function here
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.