Cerrar Bootstrap Modal


432

Tengo un cuadro de diálogo modal de bootstrap que quiero mostrar inicialmente, luego, cuando el usuario hace clic en la página, desaparece. Tengo lo siguiente:

$(function () {
   $('#modal').modal(toggle)
});

 <div class="modal" id='modal'>
     <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="myModalLabel">Error:</h3>
        </div>
        <div class="modal-body">
        <p>Please correct the following errors:</p>
        </div>
     </div>
 </div>

El modal se muestra inicialmente, pero no se cierra cuando se hace clic fuera del modal. Además, el área de contenido no está atenuada. ¿Cómo puedo hacer que el modal se muestre inicialmente y luego cerrar después de que el usuario haga clic fuera del área? ¿Y cómo puedo hacer que el fondo se atenúe como en la demostración?


¿Estás inicializando tu modal con $("#yourModal").modal()o $('.modal').modal()?
merv

Se agregó más contexto arriba. Gracias por cualquier idea @merv!
Nick B

Sí ... eso mostró el problema. @Tamil tiene tu solución.
merv

Respuestas:


706

Poner en modal('toggle')lugar demodal(toggle)

$(function () {
   $('#modal').modal('toggle');
});

55
Incluyendo el 'alternar' en absoluto es superflous. Solo asegúrese de no tener una clase 'hide' en el div modal. Pero sí, el error tipográfico estaba causando el problema. entonces +1
merv

22
no, no funciona según lo previsto, oculta el elemento modal pero el elemento de superposición de fondo todavía existe, debe usar la solución @Subodth.
Parik Tiwari

1
@Pierre: considera eliminar tu comentario, .modal (). Hide () no es lo mismo que .modal ('hide'), vas a confundir a las personas.
Michael Peterson

2
Como dijo Parik, la respuesta correcta es usar modal ('ocultar')
MidouCloud

Esta NO es la respuesta correcta, ¡verifique la respuesta a continuación!
user1467439

412

a cerca de arranque modal puede pasar 'ocultar' como opción de método modal de la siguiente

$('#modal').modal('hide');

Por favor, eche un vistazo al violín de trabajo aquí

bootstrap también proporciona eventos que puede conectar a la funcionalidad modal , como si desea activar un evento cuando el modal ha terminado de ocultarse para el usuario, puede usar el evento hidden.bs.modal , puede leer más sobre métodos modales y eventos aquí en Documentación

Si ninguno de los métodos anteriores funciona, asigne una identificación a su botón de cerrar y haga clic en el botón de cerrar.


44
$ ('# modal'). modal ('alternar'); mejor para ocultar sombra modal
hamzeh.hanandeh

55
@ hamzeh.hanandeh, togglemantiene la superposición y no es una solución. Siempre debe usar cualquiera showo hide.
ryanpcmcquen

81
$('#modal').modal('toggle'); 

o

$('#modal').modal().hide();

Deberia trabajar.

Pero si nada más funciona, puede llamar al botón de cierre modal directamente:

$("#modal .close").click()

10
el que tiene hide () cierra el modal pero deja el fondo borroso. $ ("# modal .close"). click () lo hace perfectamente. ¡Gracias!
Shilpa

44
Esto ya está claramente documentado, aquí no hay necesidad de falsificar un clic, eso parece bastante extraño. La respuesta correcta es: $ ('# modal'). Modal ('hide');
Michael Peterson

esto -> $ ('# modal'). modal (). hide ();
TARA

Tengo un modelo que no cierra, $('#modal').modal('hide')pero puedo cerrarlo usando $('#modal').modal('toggle')pero que muestra una barra de desplazamiento vertical después del cierre. Entonces, para mí $('#modal').hide()funcionó perfectamente, pero quiero saber si eso crearía algún problema. Y estoy codificando dentro, $('#modal .close').click()así que no creo que pueda usarlo para cerrar modal.
Ahtisham el

34

esto funcionó para mí:

<span class="button" data-dismiss="modal" aria-label="Close">cancel</span>

usa este enlace modal cerrar


20
$("#your-modal-id").modal('hide');

Ejecutar esta llamada a través de la clase ($(".my-modal"))no funcionará.



10

este es bastante bueno y también funciona en angular 2

$("#modal .close").click()

Funciona para mí en lugar de $('#modal').modal('toggle');que no tiene ningún efecto.
Todor Todorov

8

Mis cinco centavos en este caso es que no quiero tener que apuntar al modal de arranque con una identificación y, dado que solo debería haber un modal a la vez, lo siguiente debería ser suficiente para eliminar el modal, ya que la alternancia podría ser peligrosa :

$('.modal').removeClass('show');

2
Las intenciones son buenas, pero este enfoque no siempre funcionará. A otros elementos de la página, incluidos <body>, se les agregan clases que también tendrían que revertirse. La mejor respuesta es usar el 'hide'método.
JustinStolle

7

En algunas circunstancias, el error de escritura podría ser el culpable. Por ejemplo, asegúrese de tener:

data-dismiss="modal"

y no

data-dissmiss="modal"

Observe la doble "ss" en el segundo ejemplo que hará que falle el botón Cerrar.


6

Podemos cerrar la ventana emergente modal de las siguientes maneras:

// We use data-dismiss property of modal-up in html to close the modal-up,such as

<div class='modal-footer'><button type='button' class="btn btn-default" data-dismiss='modal'>Close</button></div>

 // We can close the modal pop-up through java script, such as

 <div class='modal fade pageModal'  id='openModal' tabindex='-1' data-keyboard='false' data-backdrop='static'>

    $('#openModal').modal('hide'); //Using modal pop-up Id.
    $('.pageModal').modal('hide'); //Using class that is defined in modal html.

6

$('.modal.in').modal('hide');

use el código anterior para ocultar el fondo de modal si está utilizando pop múltiple modal en una página.


O solo $('.modal').modal('hide');lo hará.
Matt Roy el

6

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
$(window).load(function(){
      $('#myModal').modal('show');
});
$(function () {
   $('#modal').modal('toggle');
});
</script>
</head>
<body>

<div class="container">
  <h2>Modal Example</h2>
  <!-- Trigger the modal with a button -->
  <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>

  <!-- Modal -->
  <div class="modal fade" id="myModal" role="dialog">
    <div class="modal-dialog">
    
      <!-- Modal content-->
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">Modal Header</h4>
        </div>
        <div class="modal-body">
          <p>Some text in the modal.</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>
      
    </div>
  </div>
  
</div>

</body>
</html>


Error: "mensaje": "Error de tipo no capturado: $ (...).
Modal

Si. Tengo el error si "Ejecutar fragmento de código" en Chrome (Linux Mint). Pero funciona en Firefox.
Ivan Burlutskiy

1
@Ivan Burlutskiy, gracias por informarme, este es un problema con jquery include, así que lo arreglé. ahora funciona bien en todos los navegadores.
Ganesh Putta

5
   function Delete(){
       var id = $("#dgetid").val();
       debugger
       $.ajax({
           type: "POST",
           url: "Add_NewProduct.aspx/DeleteData",
           data: "{id:'" + id + "'}",
           datatype: "json",
           contentType: "application/json; charset=utf-8",
           success: function (result) {
               if (result.d == 1) {
                   bindData();
                   setTimeout(function(){ $('#DeleteModal').modal('hide');},1000);
               }
           }
       });
   };

Hola, gracias por su respuesta. He formateado esto como código (que era bastante simple, solo sangra un poco más la primera línea). Sin embargo, supongo que solo $('#DeleteModal').modal('hide');es relevante aquí?
Rup


3

Usar modal.hide solo ocultaría el modal. Si está utilizando superposición debajo del modal, todavía estaría allí. use la llamada de clic para cerrar el modal y eliminar la superposición.

$("#modalID .close").click()

3

Otra forma de hacerlo es que primero elimine la clase modal-open, que cierra el modal. Luego elimina la clase modal-backdrop que elimina la cubierta grisácea del modal.

Se puede usar el siguiente código:

$('body').removeClass('modal-open')
$('.modal-backdrop').remove()  

Intente evitar simplemente descargar el código como respuesta e intente explicar qué hace y por qué. Es posible que su código no sea obvio para las personas que no tienen la experiencia de codificación relevante. Edite su respuesta para incluir aclaraciones, contexto e intente mencionar cualquier limitación, suposición o simplificación en su respuesta.
Fritas

OK, básicamente lo que esto hace es eliminar la clase modal-open, que cierra el modal. luego elimina la clase modal-telón de fondo que elimina la cubierta grisácea del modal
Orozcorp

3

Cerré modal programáticamente con este truco

Agregue un botón en modal con data-dismiss="modal"y oculte el botón con display: none. Así es como se verá

<div class="modal fade" id="addNewPaymentMethod" role="dialog">
  <div class="modal-dialog">
   .
   .
   .
   <button type="button" id="close-modal" data-dismiss="modal" style="display: none">Close</button>
  </div>
</div>

Ahora, cuando desee cerrar modal mediante programación, simplemente active un evento de clic en ese botón, que no es visible para el usuario

En Javascript puede activar el clic en ese botón de esta manera:

document.getElementById('close-modal').click();

2

Este código funcionó perfectamente para mí para cerrar un modal (estoy usando bootstrap 3.3)

$('#myModal').removeClass('in')

2

En mi caso, la página principal desde donde se activó el modo de arranque comenzó a no responder después de usar la $("#modal").modal('toggle');forma, pero comenzó a responder de la siguiente manera:

$("#submitBtn").on("click",function(){
  $("#submitBtn").attr("data-dismiss","modal");
});

2

Esto funciona bien

$(function () {
   $('#modal').modal('toggle');
});

Sin embargo, cuando tiene múltiples modales apilados uno encima del otro, no es efectivo, por lo que esto funciona

data-dismiss="modal"

2

Después de algunas pruebas, descubrí que para el modo de arranque debe esperar un tiempo antes de ejecutar $(.modal).modal('hide')después de la ejecución $(.modal).modal('show'). Y descubrí que en mi caso necesito al menos un intervalo de 500 milisegundos entre los dos.
Así que este es mi caso de prueba y solución:

$('.modal-loading').modal('show');
setTimeout(function() {
  $('.modal-loading').modal('hide');
}, 500);

esto resuelve los problemas que tuve con el modal no cerrando cuando abro otro, gracias
hal9000

2

Puede ver esta referencia, pero si se ha eliminado este enlace, lea esta descripción:

Llame a un modal con id myModal con una sola línea de JavaScript:

$('#myModal').modal(options)

Opciones

Las opciones se pueden pasar a través de atributos de datos o JavaScript. Para los atributos de datos, agregue el nombre de la opción a data- , como en data-backdrop = "" .

|-----------|-------------|--------|---------------------------------------------|
| Name      | Type        | Default| Description                                 |
|-----------|-------------|--------|---------------------------------------------|
| backdrop  | boolean or  | true   | Includes a modal-backdrop element.          |
|           | the string  |        | Alternatively, specify static for a         |
|           | 'static'    |        | backdrop which doesn't close the modal      |
|           |             |        | on click.                                   |
|           |             |        |                                             |
| keyboard  | boolean     | true   | Closes the modal when escape key is pressed.|   
|           |             |        |                                             |
| focus     | boolean     | true   | Puts the focus on the modal when initialized|       
|           |             |        |                                             |
| show      | boolean     | true   | Shows the modal when initialized.           |
|-----------|-------------|--------|---------------------------------------------|

Métodos

Métodos asíncronos y transiciones

Todos los métodos API son asíncronos y comienzan una transición. Vuelven a la persona que llama tan pronto como se inicia la transición pero antes de que finalice. Además, se ignorará una llamada al método en un componente en transición.

Consulte nuestra documentación de JavaScript para obtener más información.

.modal (opciones)

Activa tu contenido como modal. Acepta un objeto de opciones opcionales.

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

.modal ('alternar')

Alterna manualmente un modal. Regresa a la persona que llama antes de que el modal se haya mostrado u ocultado realmente (es decir, antes de que ocurra el evento shown.bs.modal u hidden.bs.modal).

$('#myModal').modal('toggle')

.modal ('show')

Abre manualmente un modal. Regresa a la persona que llama antes de que se muestre el modal (es decir, antes de que ocurra el evento mostrado.bs.modal).

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

.modal ('ocultar')

Oculta manualmente un modal. Regresa a la persona que llama antes de que el modal se haya ocultado realmente (es decir, antes de que ocurra el evento hidden.bs.modal).

$('#myModal').modal('hide')

.modal ('handleUpdate')

Reajuste manualmente la posición del modal si la altura de un modal cambia mientras está abierto (es decir, en caso de que aparezca una barra de desplazamiento).

$('#myModal').modal('handleUpdate')

.modal ('disponer')

Destruye el modal de un elemento.

Eventos

La clase modal de Bootstrap expone algunos eventos para engancharse a la funcionalidad modal. Todos los eventos modales se disparan en el modal mismo (es decir, en el **). Descripción del tipo

|----------------|--------------------------------------------------------------|
| Event Type     | Description                                                  |
|----------------|--------------------------------------------------------------|
| show.bs.modal  | This event fires immediately when the **show** instance      |
|                | method is called. If caused by a click, the clicked element  |
|                | is available as the **relatedTarget** property of the event. | 
|                |                                                              |
| shown.bs.modal | This event is fired when the modal has been made visible to  |
|                | the user (will wait for CSS transitions to complete). If     |
|                | caused by a click, the clicked element is available as the   | 
|                | **relatedTarget** property of the event.                     |
|                |                                                              |
| hide.bs.modal  | This event is fired immediately when the **hide** instance   |
|                | method has been called.                                      |
|                |                                                              |
| hidden.bs.modal| This event is fired when the modal has finished being hidden |
|                | from the user (will wait for CSS transitions to complete).   |
|----------------|--------------------------------------------------------------|

$('#myModal').on('hidden.bs.modal', function (e) {
  // do something...
})

0

Además, puede "hacer clic" en una 'x', que cierra el cuadro de diálogo. P.ej:

$(".ui-dialog-titlebar-close").click();


0

En mi caso, usé un botón para mostrar el modal

<button type="button" class="btn btn-success" style="color:white"
    data-toggle="modal" data-target="#my-modal-to-show" >
    <i class="fas fa-plus"></i> Call MODAL
</button>

Entonces, en mi código, para cerrar el modal (que tiene el id = 'my-modal-to-show') llamo a esa función (en mecanografiado angular):

closeById(modalId: string) {
  $(modalId).modal('toggle');
  $(modalId+ ' .close').click();
}

Si llamo $ (modalId) .modal ('hide') no funciona y no sé por qué

PD .: en mi modal también codifiqué ese elemento de botón con la clase .close

<button type="button" class="close" data-dismiss="modal" aria-label="Close"> 
    <span aria-hidden="true">&times;</span>
</button>

0

algunas veces la solución no funciona, por lo que debería eliminar correctamente la clase y agregar la pantalla css: ninguna de forma manual.

$("#modal").removeClass("in");
$("#modal").css("display","none");
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.