Como verificar se o modal de bootstrap está aberto, para que eu possa usar o jquery validate


111

preciso fazer uma validação apenas se um modal estiver aberto, porque se eu abrir, e depois fechar, e ao pressionar o botão que abre o modal ele não funciona porque está fazendo a validação do jquery, mas não mostrando porque o modal foi dispensado.

Então, eu quero anunciar um jquery se o modal estiver aberto para que eu valide, isso é possível?

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

Respostas:


183

Para evitar a condição de corrida que @GregPettit menciona, pode-se usar:

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

conforme discutido em Twitter Bootstrap Modal - IsShown .

Quando o modal ainda não está aberto, .data('bs.modal')retorna undefined, portanto o || {}- o que tornará isShowno valor (falso) undefined. Se você for rigoroso, pode-se fazer($("element").data('bs.modal') || {isShown: false}).isShown


2
Há um problema com isso, se o modal não estiver aberto, você obterá 'undefined' de $ ("element"). Data ('bs.modal')
Flezcano

._isMostrado funcionou para mim, estou usando bootstrap 4 alpha
Iftikar Urrhman Khan

8
Em Bootstrap 4, é _isShown, não isShown.
elquimista

Estou apenas verificando se modal tem classe 'mostrada' (bootstrap 4) - funciona conforme preciso. A verificação _isShown é melhor de alguma forma?
trainoasis de

Você pode compartilhar a solução digitada?
Surajit Biswas

80

Você pode usar

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

O bootstrap adiciona a inclasse quando o modal está aberto e remove-a quando fechado


4
Isso acaba sendo um pouco frágil com a opção de fade e cliques rápidos ou acionando um modal por meio de uma chamada Ajax. O atraso no fade pode criar condições de corrida. Ainda assim, uma maneira útil de se conectar a ele quando o conteúdo é estático e o modelo só aparece durante a interação do usuário!
Greg Pettit

A maneira mais segura e segura de evitar uma condição de corrida em um modal Bootstrap é inscrever-se em seus eventos shown.bs.modalou hidden.bs.modal. Dessa forma, quando seu código de evento obtém controle, você tem certeza absoluta de que o diálogo não está em um estado delicado.
Eric Lloyd

É válido no Bootstrap versão 4?
Mahdi Alkhatib

1
@MahdiAlkhatib Não, isso não funciona em Bootstrap 4. Você poderia substituir 'in'com 'show'a Bootstrap 4.
Philip Stratford

61

Você também pode usar o jQuery diretamente.

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

1
Como quando a resposta é simples. Se estiver usando ajax, eu uso no onbefore e checo e retorno false, dessa forma também evita múltiplas chamadas para o servidor. Obrigado!
eaglei22

A resposta aceita retornou indefinida ou nula. Isso funcionou perfeitamente. Obrigado!
Alex

8

Verifique se um modal está aberto

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

Para anexar um ouvinte de evento

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

6

Bootstrap 2, 3 Verifique se qualquer modal está aberto na página:

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

versão compatível Bootstrap 2, 3, 4+

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

Apenas Bootstrap 4+

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

3
Estou usando o Bootstrap 4.1.3e ele adiciona showclasse em vez de in.
Arif Hussain

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

não funcionará se o modal não tiver sido mostrado antes. Você precisará adicionar uma condição extra:

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

então a resposta levando em consideração a primeira aparição:

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



0

Por que complicar as coisas quando isso pode ser feito com jQuery simples como seguir.

$('#myModal').on('shown.bs.modal', function (e) {
    console.log('myModal is shown');
    // Your actual function here
})
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.