Como posso disparar um modal de Bootstrap programaticamente?

204

Se eu for aqui

http://getbootstrap.com/2.3.2/javascript.html#modals

E clique em 'Launch demo modal', ele faz a coisa esperada. Estou usando o modal como parte do meu processo de inscrição e há uma validação do lado do servidor envolvida. Se houver problemas, quero redirecionar o usuário para o mesmo modal com minhas mensagens de validação exibidas. No momento, não consigo descobrir como exibir o modal além de um clique físico do usuário. Como posso iniciar o modelo programaticamente?

Hoa
fonte

Respostas:

365

Para mostrar manualmente o pop-up modal, você deve fazer isso

$('#myModal').modal('show');

Você precisa inicializá-lo anteriormente para que show: falseele não apareça até que você o faça manualmente.

$('#myModal').modal({ show: false})

Onde myModalestá o ID do contêiner modal.

Claudio Redi
fonte
Obrigado. Isso deu certo. Uma observação, porém, é que, quando a caixa modal é aberta, ela redefine a rolagem e se eu acionar a caixa modal na parte inferior da página, a página é rolada para cima. Como devo parar com isso?
divinedragon
@tdubs: estranho, deve funcionar. Consulte o código modal mais recente github.com/twitter/bootstrap/blob/master/js/bootstrap-modal.js . Até agora eu vejo, ele ainda deve trabalhar
Claudio Redi
1
@ ClaudioRedi, tentei os dois no console, acho que apenas um funciona com cromo. $ ('# myModal'). modal ({show: false}) não funciona, mas $ ('# myModal'). modal ('hide') funciona. Não sei por que
Tyrone Wilson
1
Existe alguma maneira de passar um valor personalizado ou parâmetro como opção como $ ( '# myModel') modelo ({dados: 1, show: false}).
Anup Sharma
4
O @divinedragon envelhece mais tarde, eu sei, mas o problema com a rolagem para o topo da página provavelmente se deve ao acionamento do pop-up com uma tag como '<a href='#'>e falha ao return falseou preventDefaultdentro do manipulador. O navegador está seguindo as instruções e rolando até a âncora padrão - a parte superior da página. Eu já me mordi várias vezes, pois nosso CSS às vezes depende de ter um hrefconjunto para o estilo corresponder.
Brichins
54

Você não deve escrever data-toggle = "modal" no elemento que acionou o modal (como um botão) e pode mostrar o modal manualmente com:

$('#myModal').modal('show');

e esconda-se com:

$('#myModal').modal('hide');
nandop
fonte
Eu tenho uma URL que abre o modal com alternância de dados. Então, dentro do modal, eu tenho um botão que chama uma função que a última coisa que faz é fechar o modal usando o método hide que você sugere. Ótimo!
JayJay
17

Se você estiver procurando por uma criação modal programática, poderá adorar o seguinte:

http://nakupanda.github.io/bootstrap3-dialog/

Mesmo que o modal do Bootstrap forneça uma maneira de javascript para a criação modal, você ainda precisará primeiro escrever as marcações html do modal.

nakupanda
fonte
13

HTML

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-lg">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

JS

$('button').click(function(){
$('#myModal').modal('show');
});

DEMO JSFIDDLE

tvshajeer
fonte
9

você pode mostrar o modelo via jquery (javascript)

$('#yourModalID').modal({
  show: true
})

Demo: aqui

ou você pode simplesmente remover a classe "ocultar"

<div class="modal" id="yourModalID">
  # modal content
</div>

O que outras pessoas estão dizendo

HaNdTriX
fonte
4

Eu queria fazer isso da angular (2/4)maneira, aqui está o que eu fiz:

<div [class.show]="visible" [class.in]="visible" class="modal fade" id="confirm-dialog-modal" role="dialog">
..
</div>`

Coisas importantes a serem observadas :

  • visible é uma variável (booleana) no componente que governa a visibilidade do modal.
  • showe insão classes de auto-inicialização.

Um componente de exemplo & html

Componente

@ViewChild('rsvpModal', { static: false }) rsvpModal: ElementRef;
..
@HostListener('document:keydown.escape', ['$event'])
  onEscapeKey(event: KeyboardEvent) {
    this.hideRsvpModal();
  }
..
  hideRsvpModal(event?: Event) {
    if (!event || (event.target as Element).classList.contains('modal')) {
      this.renderer.setStyle(this.rsvpModal.nativeElement, 'display', 'none');
      this.renderer.removeClass(this.rsvpModal.nativeElement, 'show');
      this.renderer.addClass(document.body, 'modal-open');
    }
  }
  showRsvpModal() {
    this.renderer.setStyle(this.rsvpModal.nativeElement, 'display', 'block');
    this.renderer.addClass(this.rsvpModal.nativeElement, 'show');
    this.renderer.removeClass(document.body, 'modal-open');
  }

Html

<!--S:RSVP-->
<div class="modal fade" #rsvpModal role="dialog" aria-labelledby="niviteRsvpModalTitle" (click)="hideRsvpModal($event)">
    <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="niviteRsvpModalTitle">

                </h5>
                <button type="button" class="close" (click)="hideRsvpModal()" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">

            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary bg-white text-dark"
                    (click)="hideRsvpModal()">Close</button>
            </div>
        </div>
    </div>
</div>
<!--E:RSVP-->
Anand Rockzz
fonte
2

O código a seguir é útil para abrir modal na função openModal () e fechar em closeModal ():

      function openModal() {
          $(document).ready(function(){
             $("#myModal").modal();
          });
      }

     function closeModal () {
          $(document).ready(function(){
             $("#myModal").modal('hide');
          });  
      }

/ * #myModal é o ID do pop-up modal * /

rohit parte
fonte
1
Por favor, explique o que o código faz ao postar respostas.
Artemis ainda não confia em SE