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?

usuario1296175
fuente
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
});
Nobita
fuente
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.

Nirmal
fuente
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">
Varun Chatterji
fuente
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.

AymKdn
fuente
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.

Sam Jha
fuente
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">
Satish Singh
fuente
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.

CBarr
fuente
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á.

Vivek
fuente
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';
});
Eric B
fuente
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.

Morgan RotaStabelli
fuente
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>
usuario3634719
fuente
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.

Dibujó
fuente
¿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 ).

Mohd Abdul Mujib
fuente
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';
Haresh Hanat
fuente
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.

jfindley
fuente
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.

miguelmpn
fuente
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>
shiva krishna
fuente