No permitir que se cierre la ventana modal de Twitter Bootstrap


549

Estoy creando una ventana modal usando Twitter Bootstrap. El comportamiento predeterminado es que si hace clic fuera del área modal, el modal se cerrará automáticamente. Me gustaría deshabilitar eso, es decir, no cerrar la ventana modal al hacer clic fuera del modal.

¿Alguien puede compartir el código jQuery para hacer esto?


1
Es posible que tenga una razón perfectamente válida para hacerlo (y es probable que haya muchos otros). Sin embargo, vale la pena señalar que, en general, las consideraciones de UX desaconsejarían esto: la mayoría de los usuarios esperan que al hacer clic fuera de un modo, el contenido "debajo" aparezca "al frente".
Trevor

32
@Trevor Eso es lo contrario de modal .
Rawling

11
qué pasa si, si hay una página en el fondo que solo puede activarse si el usuario inicia sesión primero. Al hacer clic en el botón modal Ok, el usuario será redirigido a la página de inicio de sesión. Si el usuario puede simplemente hacer clic, esto significa que el usuario omite la página de inicio de sesión y solo accede a la página sin iniciar sesión. All Hell Break Loose
jumper rbk

55
@Trevor No veo ninguna evidencia para respaldar su reclamo.
1252748

La característica es sensible en un escenario en el que el usuario tiene que completar muchos campos de formulario en el modal. Si el usuario hace clic accidentalmente fuera del modal, se perderán todos los detalles ingresados; entonces tendrían que reactivar el modal y rellenar los campos. Esta característica evitaría tal irritación.
mickmackusa

Respuestas:


692

Creo que desea establecer el valor de fondo en estático . Si desea evitar que la ventana se cierre al usar la Esctecla, debe establecer otro valor.

Ejemplo:

<a data-controls-modal="your_div_id"
   data-backdrop="static"
   data-keyboard="false"
   href="#">

O si está utilizando JavaScript:

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
});

77
@ user1296175 ¿Cuál fue su código final para lograr esto? Quiero hacer lo mismo.
AlphaMale

44
Gracias @nobita, agregar data-backdrop = "static" hace el truco! El documento de arranque de Twitter es pobre :(
Blue Smith

2
Verifique la respuesta de @@ Varun Chatterji e inclúyala en su definición modal
Leandro

1
deshabilite el clic externo para todos los modales con una sola línea de js: $ .fn.modal.Constructor.DEFAULTS.backdrop = 'static';
Lukas Liesis

1
Para usuarios angulares: var modalInstance = $ modal.open ({templateUrl: 'modalTemplate.html', controller: 'modalController', backdrop: 'static',});
Alexandr

310

Simplemente configure la backdroppropiedad en 'static'.

$('#myModal').modal({
  backdrop: 'static',
  keyboard: true
})

También es posible que desee establecer la keyboardpropiedad en falseporque eso evita que se cierre el modal presionando la Esctecla en el teclado.

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

myModal es la ID del div que contiene su contenido modal.


66
Sí, esta es la respuesta más simple y limpia (ya que evita agregar atributos de datos). Como referencia, backdropy keyboardse mencionan aquí en su documentación en la sección Opciones .
Jesse Dupuy

¿Se deben evitar los atributos de datos? Guía amable sobre esto.

@GopalAggarwal: depende de cómo configure el modal. Si asocia un modal a múltiples etiquetas de anclaje, entonces el uso de atributos de datos podría tener sentido. Pero cuando solo hay un modal por etiqueta, iría con los parámetros del script donde cada comportamiento es visible en un solo lugar.
Nirmal

77
También para evitar que la visualización modal pase inmediatamente en show: false
ClearCloud8

214

También puede incluir estos atributos en la definición modal en sí:

<div class="modal hide fade" data-keyboard="false" data-backdrop="static">

44
Sí, esta es la respuesta más simple y limpia (ya que funciona agregando atributos de datos). Como referencia, el telón de fondo y el teclado se mencionan aquí en su documentación en la sección Opciones.
fluyó el

Si inicia modal en la carga de la página, esta es la mejor manera de eliminar otras opciones de cierre.
santa

46

Si ya ha inicializado la ventana modal, es posible que desee restablecer las opciones $('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})para asegurarse de que aplicará las nuevas opciones.


1
Esto me ayudó. Después de configurar el "telón de fondo: 'estático'", el usuario aún puede cerrar el modal con un clic; Parecía un error, ¡pero esto funcionó!
Omar

77
Por ahora: $ ('# modal'). RemoveData ('bs.modal'). Modal ({telón de fondo: 'estático', teclado: falso});
D3VELOPER

34

Anule el evento Bootstrap 'hide' de Diálogo y detenga su comportamiento predeterminado (para eliminar el diálogo).

Consulte el fragmento de código a continuación:

   $('#yourDialogID').on('hide.bs.modal', function(e) {

       e.preventDefault();
   });

Funciona bien en nuestro caso.


2
entonces, ¿cómo revertirlo?
sertaconay

3
Simplemente elegante gracias :) Y @sertaconay simplemente crea una variable booleana (por ejemplo) que se verificará para decidir si quieres evitar el valor predeterminado
Nimrod Yonatan Ben-Nes

1
la única opción aquí que funcionó después de que se
abrió

2
Esta es una solución perfecta si desea tener un control más preciso sobre cuándo los modales se pueden cerrar y cuándo no.
Curos

33

Sí, puedes hacerlo así:

<div id="myModal"  tabindex="-1" role="dialog"
     aria-labelledby="myModalLabel"
     aria-hidden="true"
     data-backdrop="static"  data-keyboard="false">

Esto es perfecto para un caso en el que el modal se declara en el html y solo se abre a través de javascript, es decir, no hay ningún enlace. ¡Gracias!
hgolov

22

Como la respuesta de @ AymKdn, pero esto le permitirá cambiar las opciones sin reiniciar el modal.

$('#myModal').data('modal').options.keyboard = false;

O si necesita hacer varias opciones, ¡JavaScript es withútil aquí!

with ($('#myModal').data("modal").options) {
    backdrop = 'static';
    keyboard = false;
}

Si el modal ya está abierto, estas opciones solo tendrán efecto la próxima vez que se abra el modal.


stackoverflow.com/questions/16030448/… Sin embargo, no me gusta esta solución
Victor

14

Solo agrega estas dos cosas

data-backdrop="static" 
data-keyboard="false"

Se verá así ahora

<div class="modal fade bs-example-modal-sm" id="myModal" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">

Desactivará el botón de escape y también el clic en cualquier lugar y se ocultará.


Este consejo fue proporcionado años antes.
mickmackusa

11

Puede deshabilitar el comportamiento de hacer clic para cerrar el fondo y hacer que este sea el predeterminado para todos sus modales agregando este JavaScript a su página (asegúrese de que se ejecute después de cargar jQuery y Bootstrap JS):

$(function() {
    $.fn.modal.Constructor.DEFAULTS.backdrop = 'static';
});

6

Como dice D3VELOPER, el siguiente código lo resuelve:

$('#modal').removeData('bs.modal').modal({backdrop: 'static', keyboard: false});

Estoy usando jquery y bootstrap y simplemente removeData('modal')no funcionan.


4

Lo mejor que encontré es agregar este código al enlace

<!-- Link -->
<a href="#mdl" role="button"  data-backdrop="static" data-keyboard="false" data-toggle="modal" id_team="" ></a>
<-- Div -->
<div id="mdl" class="modal hide fade" tabindex="-1" role="dialog" data-keyboard="false" data-backdrop="static"></div>

2

En caso de que alguien venga de Google tratando de descubrir cómo evitar que alguien cierre un modal, no olvide que también hay un botón de cierre en la parte superior derecha del modal que debe eliminarse.

Usé un poco de CSS para ocultarlo:

#Modal .modal-header button.close {
    visibility: hidden;
}

Tenga en cuenta que usando "display: none;" se sobrescribe cuando se crea el modal, así que no lo uses.


¿No puedes simplemente eliminar el botón del encabezado modal?
tonto

A veces es beneficioso usar CSS en lugar de alterar el HTML.
Dibujó

2

Si desea deshabilitar condicionalmente la backdrop click closingfunción. Puede usar la siguiente línea para establecer la backdropopción staticdurante el tiempo de ejecución.

Bootstrap v3.xx

jQuery('#MyModal').data('bs.modal').options.backdrop = 'static';

Bootstrap v2.xx

jQuery('#MyModal').data('modal').options.backdrop = 'static';

Esto evitará que se cierre un modelo ya instanciado con la backdropopción establecida en false( el comportamiento predeterminado ).


2

Puede establecer el comportamiento predeterminado de la ventana emergente modal utilizando la siguiente línea de código:

 $.fn.modal.prototype.constructor.Constructor.DEFAULTS.backdrop = 'static';

como +1 este método, no quiero esa opción para todos los modales.
tsohr

2

Hacer eso es muy fácil hoy en día. Solo agrega:

data-backdrop="static" data-keyboard="false" 

En tu divisor modal.


Este consejo se proporcionó años antes en esta misma página.
mickmackusa

1

Bueno, esta es otra solución que algunos de ustedes podrían estar buscando (como yo ...)

Mi problema era similar, el cuadro modal se estaba cerrando mientras el iframe que tenía dentro se estaba cargando, por lo que tuve que deshabilitar el descarte modal hasta que el Iframe termine de cargarse y luego volver a habilitarlo.

Las soluciones presentadas aquí no funcionaban al 100%.

Mi solución fue esta:

showLocationModal = function(loc){

    var is_loading = true;

    if(is_loading === true) {

        is_loading  = false;
        var $modal   = $('#locationModal');

        $modal.modal({show:true});

        // prevent Modal to close before the iframe is loaded
        $modal.on("hide", function (e) {
            if(is_loading !== true) {
                e.preventDefault();
                return false
            }
        });

        // populate Modal
        $modal.find('.modal-body iframe').hide().attr('src', location.link).load(function(){

            is_loading = true;
     });
}};

Entonces evito temporalmente que el Modal se cierre con:

$modal.on("hide", function (e) {
    if(is_loading !== true) {
        e.preventDefault();
        return false
    }
});

Pero con var is_loading que volverá a habilitar el cierre después de que se cargue el Iframe.


1
<button type="button" class="btn btn-info btn-md" id="myBtn3">Static 
Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal3" role="dialog">
<div class="modal-dialog">
  <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">×</button>
      <h4 class="modal-title">Static Backdrop</h4>
    </div>
    <div class="modal-body">
      <p>You cannot click outside of this modal to close it.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-
      dismiss="modal">Close</button>
    </div>
   </div>
  </div>
</div>
   <script>
    $("#myBtn3").click(function(){
     $("#myModal3").modal({backdrop: "static"});
    });
   });
  </script>

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.