¿Cómo destruir completamente la ventana modal de bootstrap?

83

He hecho uso de la ventana modal para una implementación de asistente que tiene alrededor de 4,5 pasos. Necesito destruirlo por completo después del último paso (onFinish) y el paso OnCancel sin tener que actualizar la página . Por supuesto, puedo ocultarlo, pero ocultar las ventanas modales restaura todo como tal cuando lo abro de nuevo. ¿Alguien podría ayudarme con este tema?

Gracias Las respuestas a las sugerencias son útiles para mí.

Akki
fuente
2
¿Estás usando jQuery o algo similar? Podría ser capaz de hacer $(modal_selector).remove().
robbrit
Gracias, déjame comprobar si funciona o no.
Akki
gracias, funciona, pero cuando rev = invokemos no es invocado por modal.show () .. entonces, ¿cómo volver a invocarlo?
Akki
remove, realmente eliminará el modal, por lo que no se puede volver a abrir. Las ventanas modales de Twitter Bootstrap no son nada mágicas, así que cuando vuelves a abrir un diálogo modal tienes que restablecer todos los elementos del formulario manualmente (esa ha sido mi experiencia).
robbrit
Depende de lo que esté mostrando en el modal. Twitter Bootstrap solo maneja la visualización del modal, lo que sea que contenga es tu responsabilidad.
robbrit

Respuestas:

120

si es bootstrap 3 puedes usar:

$("#mimodal").on('hidden.bs.modal', function () {
    $(this).data('bs.modal', null);
});
usuario2612497
fuente
7
Como todas las demás respuestas, esto no parece eliminar el telón de fondo.
htulipe
1
@htulipe El enfoque es correcto pero no funcionará con efectos de transición en el modal. Deberá eliminar la clase .fade de modal para que funcione.
perforador
3
@drillingman: +1 que funcionó para mí:$("#mimodal").removeClass('fade').modal('hide')
John Gietzen
5
Lo único en BS3 que funcionó para mí fue:$(this).html("");
Ryan Currah
1
¿Cómo lo borras exactamente por completo? @Loenix
AlexioVay
41

NOTA: Esta solución solo funciona para Bootstrap antes de la versión 3. Para obtener una respuesta de Bootstrap 3, consulte esta de user2612497 .

Lo que quieres hacer es:

$('#modalElement').on('hidden', function(){
    $(this).data('modal', null);
});

eso hará que el modal se inicialice a sí mismo cada vez que se muestre. Entonces, si está utilizando contenido remoto para cargar en el div o lo que sea, lo volverá a hacer cada vez que se abra. Simplemente está destruyendo la instancia modal después de cada vez que se oculta.

O siempre que desee activar la destrucción del elemento (en caso de que no lo sea cada vez que lo oculta) solo tiene que llamar a la línea media:

$('#modalElement').data('modal', null);

Twitter bootstrap busca que su instancia esté ubicada en el atributo de datos, si existe una instancia, simplemente la alterna, si una instancia no existe, creará una nueva.

Espero que ayude.

Conar galés
fuente
5
Esto realmente funciona, sin embargo, de una manera ligeramente diferente, $("#modalElement").removeData("modal"); estoy usando Bootstrap 2.3.1 y jQuery 1.9.1
tlavarea
5
Si usa Bootstrap 3, debe escuchar el en hidden.bs.modallugar del hiddenevento. getbootstrap.com/javascript/#modals
Romain Paulus
19

Para la versión 3.x

$( '.modal' ).modal( 'hide' ).data( 'bs.modal', null );

Para la versión 2.x (arriesgado; lea los comentarios a continuación) Cuando crea bootstrap modal, se cambian tres elementos en su página. Entonces, si desea revertir por completo todos los cambios, debe hacerlo manualmente para cada uno de ellos.

$( '.modal' ).remove();
$( '.modal-backdrop' ).remove();
$( 'body' ).removeClass( "modal-open" );
zelibobla
fuente
El uso de pasos manuales es un enfoque arriesgado, ya que el código de Bootstrap puede cambiar y es posible que pierda algunos aspectos. Por ejemplo, al menos en Bootstrap 3.2 style="padding-right: 17px;"se configurará bodytambién para tener en cuenta la barra de desplazamiento oculta. En pocas palabras: use Bootstraps API, que en v3 sería $('.modal').modal('hide').data('bs.modal', null);.
Oliver
Sí, tienes razón. Esto fue escrito para la versión 2.x. Actualizado.
zelibobla
si inyecta datos dinámicamente a modal y elimina toda la segunda parte de su respuesta, eliminará mucho más de lo necesario. Más allá del punto de reutilizar modal. Si ayuda, sugiero usar su class.remove () específica;
alphapilgrim
13

Puede destruir completamente un modal sin recargar la página de esta manera.

$("#modal").remove();
$('.modal-backdrop').remove();

pero eliminará completamente modal de su página html. Después de este espectáculo de ocultar modal no funcionará.

Arjun
fuente
.remove () lo elimina por completo. Y .show () ya no funciona. ¿Qué hago para inicializarlo de nuevo?
geeky_monster
Dado que la creación de modal de bootstrap, los cambios en la bodysolución sugerida no revertirán todos los cambios.
zelibobla
2
Esto no funcionará porque el telón de fondo se atascará, ¿por qué se votó a favor?
codenamezero
5

He intentado la respuesta aceptada, pero no parece funcionar de mi parte y no sé cómo se supone que funciona la respuesta aceptada.

$('#modalId').on('hidden.bs.modal', function () {
  $(this).remove();
})

Esto está funcionando perfectamente bien de mi lado. Versión BS> 3

طلحة
fuente
Esto deja un fondo gris y deja la página web inutilizable.
Biju
4

El poder de jQuery. $(selector).modal('hide').destroy();primero eliminará los sinds, es posible que tenga el efecto de deslizamiento y luego eliminará el elemento por completo, sin embargo, si desea que el usuario pueda abrir el modal nuevamente después de completar los pasos. es posible que solo desee actualizar solo la configuración que desea restablecer, por lo que para restablecer todas las entradas en su modal, esto se vería así:

$(selector).find('input, textarea').each(function(){
   $(this).val('');
});
John In't Hout
fuente
3

Por lo que tengo entendido, ¿no quieres eliminarlo ni ocultarlo? Porque es posible que desee reutilizarlo más tarde ... pero ¿no quiere que tenga el contenido anterior si alguna vez lo vuelve a abrir?

<div class="modal hide fade">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times</button>
        <h3>Modal header</h3>
    </div>
    <div class="modal-body">
        <p>One fine body…</p>
    </div>
    <div class="modal-footer">
        <a href="#" class="btn">Close</a>
        <a href="#" class="btn btn-primary">Save changes</a>
    </div>
</div>

Si quieres usarlo como plantilla dinámica, haz algo como

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

....

$(selector).modal({show: false})
$(".modal-body").empty()

....

$(".modal-body").append("new stuff & text")
$(selector).modal({show: true})
Robert Hoffmann
fuente
3

bootstrap 3 + jquery 2.0.3:

$('#myModal').on('hide.bs.modal', function () {
   $('#myModal').removeData();
})
usuario2813480
fuente
1
Dado que la creación de modal de bootstrap, los cambios en la bodysolución sugerida no revertirán todos los cambios.
zelibobla
3

Si tiene un iframe en su modal, puede eliminar su contenido mediante el siguiente código:

$('#myModal').on('hidden.bs.modal', function(){
   $(this).find('iframe').html("");
   $(this).find('iframe').attr("src", "");
});
Saeid
fuente
este fue el que me ayudó;) así que no necesitaba una API para detenerlo
Alexa Adrian
2

Mi enfoque sería utilizar el clone()método de jQuery. Crea una copia de su elemento, y eso es lo que quiere: una copia de su primer modal inalterado, que puede reemplazar cuando lo desee: Demo (jsfiddle)

var myBackup = $('#myModal').clone();

// Delegated events because we make a copy, and the copied button does not exist onDomReady
$('body').on('click','#myReset',function() {
    $('#myModal').modal('hide').remove();
    var myClone = myBackup.clone();
    $('body').append(myClone);
});

El marcado que utilicé es el más básico, por lo que solo necesita vincular los elementos / eventos correctos, y debe restablecer su asistente.

Tenga cuidado de enlazar con eventos delegados , o volver a enlazar en cada reinicio los elementos internos de su modal para que cada nuevo modal se comporte de la misma manera.

Sherbrow
fuente
2

Esta es mi solución:

this.$el.modal().off();

Daniel Ortegón
fuente
1

Tuve el mismo escenario en el que abriría un nuevo modal al hacer clic en un botón. Una vez hecho esto, quiero eliminarlo por completo de mi página ... utilizo eliminar para eliminar el modal. Al hacer clic en el botón, verificaría si el modal existe, y si es cierto, lo destruiría y crearía un nuevo modal.

$("#wizard").click(function() {
    /* find if wizard is already open */
    if($('.wizard-modal').length) {
        $('.wizard-modal').remove();
    }
});
Vikalp Veer
fuente
1
$('#myModal').on('hidden.bs.modal', function () {
      $(this).data('bs.modal', null).remove();
});

//Just add .remove(); 
//Bootstrap v3.0.3
Luca Di Lenardo
fuente
Si bien este código puede, de hecho, ser una solución al problema, generalmente es una buena idea incluir una explicación de lo que hace cuando responde una pregunta.
Sebastian Lenartowicz
Okay. Tenía prisa ... de todos modos agregue ".remove ();" para eliminar todas las referencias y el código html de su modal de arranque.
Luca Di Lenardo
1

Esto elimina completamente el modal del DOM, también funciona para los modales "añadidos".

#pickoptionmodal es la identificación de mi ventana modal.

$(document).on('hidden.bs.modal','#pickoptionmodal',function(e){

e.preventDefault();

$("#pickoptionmodal").remove();

});
Alin Razvan
fuente
Después de esto, ¿se puede reiniciar el modal?
rahim.nagori
@ rahim.nagori, como escribe en la descripción, está eliminando el modal del DOM, puede volver a agregarlo ... no está cerrando el modal, lo está eliminando, el hilo se trata de destruir la ventana modal por completo.
Alin Razvan
1

Tengo que destruir el modal justo después de cerrarlo con un clic de botón, y se me ocurrió lo siguiente.

$("#closeModal").click(function() {
    $("#modal").modal('hide').on('hidden.bs.modal', function () {
        $("#modal").remove();
    });
});

Tenga en cuenta que esto funciona con Bootstrap 3.

dijoe
fuente
1
Esto deja un fondo gris y deja la página web inutilizable.
Biju
1

También funciona en bootstrap 4.x

$('#modal_ID').modal( 'hide' ).data( 'bs.modal', null );
Cristian Ghirba
fuente
Esto elimina el modal pero deja un fondo gris que hace que la página web sea inutilizable
Biju
¿En qué versión de bootstrap lo probaste?
Cristian Ghirba
0

Si la sombra modal permanece más oscura y no va a mostrar más de un modal, esto será útil

$('.modal').live('hide',function(){
    if($('.modal-backdrop').length>1){
        $('.modal-backdrop')[0].remove();
    }
});
Akshay
fuente
1
Live está desactualizado, para ser reemplazado por on y el [0] en el elemento al que te diriges no es necesario si estás usando jQuery. Además, si elimina el fondo por completo, tenga en cuenta que es posible que deba volver a agregarlo ... Intente: $(document).on('hidden.bs.modal', '.modal', function(e) { if ($('.modal-backdrop').length) { $('.modal-backdrop').remove(); } });
Thomas Bennett
0

Tuve que usar el mismo modal para diferentes clics en enlaces. Acabo de reemplazar el contenido html con "" vacío del modal en la devolución de llamada oculta.

guy_fawkes
fuente
0

Esto funcionó para mí.

$('.modal-backdrop').removeClass('in');
$('#myDiv').removeClass('in');

El diálogo y el fondo desaparecieron, pero volvieron la próxima vez que hice clic en el botón.

Rob Y
fuente
0

Funciona para Bootstrap v3.3.6

$('#dialog').modal()
.on('hide.bs.modal', function () {
    // Some Code
}).on('shown.bs.modal', function () {
    // Some Code
}).on('hidden.bs.modal', function () {
    $("#dialog").off();
});
Maksym Kalin
fuente
0

solo esto funcionó para mi

$('body').on('hidden.bs.modal', '.modal', function() {
    $('selector').val('');
});

Es seguro forzar a los selectores a dejarlos en blanco ya que las versiones de bootstrap y jquery pueden ser la razón de este problema

Amir
fuente
Esto deja un fondo gris y deja la página web inutilizable.
Biju
0

Eliminación completa de una sola línea en la piel (ES6)

$("#myModal").on('hidden.bs.modal', (e)=>e.currentTarget.remove());

Dieter Gribnitz
fuente
-1

Con ui-router, esta puede ser una opción para usted. Vuelve a cargar el controlador al cerrar, por lo que reinicializa el contenido modal antes de que se active la próxima vez.

$("#myModalId").on('hidden.bs.modal', function () {
  $state.reload();  //resets the modal
});
Bill Milagro
fuente
-4

No sé cómo puede sonar esto, pero esto funciona para mí ...........

$("#YourModalID").modal('hide');
Samson Iyanda
fuente
Votó en contra porque solo oculta el modal lo que claramente no se preguntó.
AlexioVay