How to get modal close event in JavaScript?

Evitar cierre modal Bootstrap 5 al clickear fuera

hace 10 años

★★★★★Valoración: 4.74 (4613 votos)

Los modales de Bootstrap 5 son componentes esenciales para crear ventanas emergentes interactivas en tu sitio web. Son ideales para mostrar notificaciones, formularios, alertas y cualquier tipo de contenido que necesites presentar de manera destacada al usuario. Por defecto, los modales de Bootstrap están diseñados para cerrarse automáticamente cuando el usuario hace clic fuera del modal, en el área conocida como "backdrop". Si bien este comportamiento es útil en muchos casos, existen situaciones donde deseas evitar que el modal se cierre al hacer clic fuera. En este artículo, te guiaremos paso a paso para lograr que tus modales de Bootstrap 5 permanezcan abiertos, brindando mayor control sobre la interacción del usuario con estos elementos.

How do I add a close button to modal in Bootstrap?
To add a close button to a Bootstrap modal, you can include a button element inside the modal header with the appropriate Bootstrap classes. Adding a close button to a Bootstrap modal allows users to easily dismiss the modal window without any additional actions.
Índice de Contenido

¿Qué son los Modales de Bootstrap 5 y cómo funcionan?

Antes de sumergirnos en cómo evitar el cierre al hacer clic fuera, es fundamental comprender qué son y cómo funcionan los modales en Bootstrap 5. Básicamente, un modal es una ventana que se superpone al contenido principal de la página web. Bootstrap 5 proporciona un plugin JavaScript robusto para crear y gestionar estos diálogos de manera sencilla y eficiente.

Los modales de Bootstrap se construyen utilizando HTML, CSS y JavaScript. Se posicionan sobre cualquier otro elemento en el documento y, por defecto, eliminan la barra de desplazamiento del <body> para que el contenido del modal se desplace dentro de la ventana modal. Un aspecto importante a tener en cuenta es que, de forma predeterminada, al hacer clic en el "backdrop" del modal, este se cierra automáticamente. Bootstrap está diseñado para soportar un solo modal abierto a la vez, ya que los modales anidados no se recomiendan debido a la mala experiencia de usuario que pueden generar.

Internamente, los modales utilizan position: fixed, lo que puede generar comportamientos particulares en ciertas situaciones. Por ello, se aconseja colocar el HTML del modal en una posición de nivel superior en el DOM para evitar posibles interferencias con otros elementos, especialmente si estás anidando modales dentro de elementos con position: fixed. Además, es importante considerar las limitaciones de position: fixed en dispositivos móviles, por lo que te recomendamos revisar la documentación de soporte de navegadores de Bootstrap para obtener más detalles.

El Comportamiento Predeterminado de Cierre de Modales

Como mencionamos, el comportamiento estándar de los modales de Bootstrap 5 es cerrarse al hacer clic fuera de la ventana modal. Esto se debe a que, por defecto, el plugin JavaScript está configurado para detectar los clics en el backdrop y ejecutar la acción de cierre. Este comportamiento se implementa para mejorar la usabilidad, permitiendo a los usuarios cerrar rápidamente el modal si ya no lo necesitan o si han hecho clic accidentalmente para abrirlo.

Sin embargo, hay escenarios donde este comportamiento predeterminado no es deseable. Imagina un formulario complejo dentro de un modal donde el usuario necesita tiempo para completar la información. En estos casos, cerrar el modal accidentalmente al hacer clic fuera podría generar frustración y una mala experiencia de usuario. Es aquí donde entra en juego la necesidad de prevenir el cierre del modal al hacer clic fuera.

¿Cómo Evitar que un Modal de Bootstrap 5 se Cierre al Hacer Clic Fuera?

La solución para evitar que un modal de Bootstrap 5 se cierre al hacer clic fuera es utilizar la opción backdrop: 'static'. Esta opción se puede configurar de dos maneras:

  1. Mediante atributos de datos HTML: Puedes agregar el atributo data-bs-backdrop="static" al elemento <div class="modal">.
  2. Mediante JavaScript: Al inicializar el modal con JavaScript, puedes pasar un objeto de opciones que incluya backdrop: 'static'.

Usando el atributo data-bs-backdrop="static"

Esta es la forma más sencilla de configurar el backdrop estático. Simplemente debes añadir el atributo data-bs-backdrop="static" al elemento HTML que define tu modal. Cuando se establece data-bs-backdrop="static", el modal no se cerrará al hacer clic en el backdrop. En su lugar, el backdrop permanecerá y el modal seguirá visible hasta que se cierre explícitamente, por ejemplo, haciendo clic en un botón de cierre dentro del modal.

Aquí tienes un ejemplo de código HTML que muestra cómo implementar un modal con backdrop estático utilizando el atributo data-bs-backdrop="static":

<!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdropModal"> Abrir modal con backdrop estático </button> <!-- Modal --> <div class="modal fade" id="staticBackdropModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="staticBackdropModalLabel">Modal con Backdrop Estático</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> Este modal no se cerrará si haces clic fuera de él. Intenta hacer clic en el backdrop. </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button> <button type="button" class="btn btn-primary">Entendido</button> </div> </div> </div> </div> 

En este ejemplo, al hacer clic en el botón "Abrir modal con backdrop estático", se mostrará un modal. Si intentas hacer clic fuera del modal, en el backdrop, verás que el modal no se cierra. Solo se cerrará si haces clic en el botón "Cerrar" o en el botón de cierre (la "x") en la esquina superior derecha.

Usando JavaScript y la opción backdrop: 'static'

Si prefieres controlar el comportamiento del modal mediante JavaScript, puedes usar la opción backdrop: 'static' al inicializar el modal. Aquí te mostramos cómo hacerlo:

var staticBackdropModal = document.getElementById('staticBackdropModalJS'); var modal = new bootstrap.Modal(staticBackdropModal, { backdrop: 'static' }); // Para mostrar el modal programáticamente: // modal.show(); 

Y aquí está el HTML correspondiente para este ejemplo JavaScript:

<!-- Button trigger modal --> <button type="button" class="btn btn-primary" id="launchStaticBackdropModalJS"> Abrir modal con backdrop estático (JS) </button> <!-- Modal --> <div class="modal fade" id="staticBackdropModalJS" tabindex="-1" aria-labelledby="staticBackdropModalJSLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="staticBackdropModalJSLabel">Modal con Backdrop Estático (JS)</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> Este modal tampoco se cerrará si haces clic fuera de él. ¡Implementado con JavaScript! </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button> <button type="button" class="btn btn-primary">¡Entendido!</button> </div> </div> </div> </div> <script> document.getElementById('launchStaticBackdropModalJS').addEventListener('click', function(){ var staticBackdropModal = document.getElementById('staticBackdropModalJS'); var modal = new bootstrap.Modal(staticBackdropModal, { backdrop: 'static' }); modal.show(); }); </script> 

En este segundo ejemplo, utilizamos JavaScript para inicializar el modal y pasar la opción backdrop: 'static'. El resultado es el mismo que en el ejemplo anterior: el modal no se cerrará al hacer clic fuera.

Opciones Adicionales para Controlar el Comportamiento del Modal

Además de la opción backdrop: 'static', Bootstrap 5 ofrece otras opciones para personalizar el comportamiento de los modales:

  • keyboard: Controla si el modal se cierra al presionar la tecla Escape (Esc). Por defecto, es true. Si lo estableces en false, el modal no se cerrará al presionar Esc. Puedes usar data-bs-keyboard="false" en HTML o keyboard: false en JavaScript. En los ejemplos de backdrop estático anteriores, hemos incluido data-bs-keyboard="false" para que el modal tampoco se cierre al presionar la tecla Escape, proporcionando un control aún más estricto sobre el cierre del modal.
  • focus: Determina si el foco se coloca automáticamente en el modal al abrirse. Por defecto es true.

Ejemplos Prácticos y Código HTML

A continuación, te presentamos algunos ejemplos prácticos para que veas en acción cómo evitar el cierre del modal al hacer clic fuera:

Ejemplo 1: Modal simple con backdrop estático

<div class="modal fade" id="simpleStaticModal" data-bs-backdrop="static" tabindex="-1" aria-labelledby="simpleStaticModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="simpleStaticModalLabel">Modal Simple Estático</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> Este es un modal simple con backdrop estático. Haz clic fuera para comprobar que no se cierra. </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button> </div> </div> </div> </div> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#simpleStaticModal"> Abrir Modal Simple Estático </button> 

Ejemplo 2: Modal con formulario y backdrop estático

<div class="modal fade" id="formStaticModal" data-bs-backdrop="static" tabindex="-1" aria-labelledby="formStaticModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="formStaticModalLabel">Modal con Formulario Estático</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <form> <div class="mb-3"> <label for="name" class="form-label">Nombre</label> <input type="text" class="form-control" id="name"> </div> <div class="mb-3"> <label for="email" class="form-label">Email</label> <input type="email" class="form-control" id="email"> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button> <button type="button" class="btn btn-primary">Guardar</button> </div> </div> </div> </div> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#formStaticModal"> Abrir Modal con Formulario Estático </button> 

Preguntas Frecuentes (FAQ)

¿Por qué querría evitar que un modal se cierre al hacer clic fuera?
En situaciones donde necesitas asegurar que el usuario interactúe completamente con el modal, como en formularios importantes o avisos críticos. Evitar el cierre accidental mejora la experiencia en estos casos.
¿Qué diferencia hay entre backdrop: true y backdrop: 'static'?
backdrop: true (o simplemente omitir la opción, ya que es el valor por defecto) cierra el modal al hacer clic fuera. backdrop: 'static' impide el cierre al hacer clic fuera, manteniendo el modal visible.
¿Puedo combinar backdrop: 'static' con keyboard: false?
Sí, puedes combinarlos para un control de cierre más estricto. Con ambas opciones configuradas, el modal solo se cerrará mediante un botón de cierre dentro del propio modal.
¿Es recomendable usar siempre backdrop: 'static'?
No necesariamente. El uso de backdrop: 'static' debe ser estratégico. Utilízalo cuando realmente necesites evitar el cierre accidental y guiar al usuario a interactuar de manera específica con el modal. En otros casos, el comportamiento predeterminado (cierre al clic fuera) puede ser más intuitivo.

Conclusión

Controlar el comportamiento de cierre de los modales de Bootstrap 5 es esencial para ofrecer una experiencia de usuario óptima. La opción backdrop: 'static' te brinda la flexibilidad de evitar el cierre accidental al hacer clic fuera, permitiéndote crear interacciones más robustas y dirigidas. Recuerda evaluar cuidadosamente cuándo es apropiado utilizar esta opción y combinarla con otras configuraciones como keyboard: false para lograr el comportamiento deseado en tus aplicaciones web. ¡Experimenta con los ejemplos y adapta estas técnicas a tus proyectos para potenciar la usabilidad de tus modales!

Subir