부트 스트랩 모달 창을 완전히 파괴하는 방법은 무엇입니까?


83

내가 사용했습니다 모달 창을 약 4,5 단계가 마법사 구현. 페이지를 새로 고치지 않고 마지막 단계 (onFinish) 및 OnCancel 단계 후에 완전히 삭제해야합니다 . 물론 숨길 수는 있지만 모달 창을 숨기면 다시 열면 모든 것이 복원됩니다. 누구든지이 문제에 대해 나를 도울 수 있습니까?

감사합니다 모든 힌트 답변이 도움이됩니다.


2
jQuery 또는 유사한 것을 사용하고 있습니까? 할 수 있을지도 몰라요 $(modal_selector).remove().
robbrit

감사합니다. 작동하는지 확인해 보겠습니다.
Akki

고맙게도 작동하지만 rev = invoke가 modal.show () ..에 의해 호출되지 않으면 어떻게 다시 호출합니까?
Akki

그래 remove정말 모달을 삭제하므로 다시 열 수 없습니다. Twitter Bootstrap의 모달 창은 실제로 마법 같은 것이 아니므로 모달 대화 상자를 다시 열 때 모든 양식 요소를 수동으로 재설정해야합니다 (내 경험이었습니다).
robbrit

모달에 표시하는 내용에 따라 다릅니다. Twitter Bootstrap은 모달의 표시 만 처리합니다. 그 안에있는 것은 무엇이든 귀하의 책임입니다.
robbrit

답변:


122

부트 스트랩 3이면 다음을 사용할 수 있습니다.

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

8
다른 모든 답변과 마찬가지로 이것은 배경을 제거하지 않는 것 같습니다.
htulipe 2013

1
@htulipe 접근 방식은 맞지만 모달의 전환 효과와 함께 작동하지 않습니다. 작동하려면 모달에서 .fade 클래스를 제거해야합니다.
drillingman

4
@drillingman : +1 나를 위해 일한 :$("#mimodal").removeClass('fade').modal('hide')
존 Gietzen

5
나를 위해 일한 것을 BS3에서 유일한했다 :$(this).html("");
라이언 Currah

1
어떻게 완전히 완전히 삭제합니까? @Loenix
AlexioVay 2011

41

참고 :이 솔루션은 버전 3 이전의 Bootstrap에서만 작동합니다. Bootstrap 3 답변 은 user2612497의 답변을 참조하십시오 .

원하는 것은 다음과 같습니다.

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

그러면 모달이 표시 될 때마다 자체적으로 초기화됩니다. 따라서 원격 콘텐츠를 사용하여 div 등으로로드하는 경우 열릴 때마다 다시 수행됩니다. 숨길 때마다 모달 인스턴스를 파괴하는 것입니다.

또는 요소의 파괴를 트리거 할 때마다 (실제로 숨길 때마다 그렇지 않은 경우) 중간 줄을 호출하면됩니다.

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

Twitter 부트 스트랩은 인스턴스가 데이터 속성에 위치 할 인스턴스를 찾고, 인스턴스가 있으면 토글하고, 인스턴스가 없으면 새 인스턴스를 만듭니다.

도움이 되었기를 바랍니다.


5
이것은 실제로 작동하지만 약간 다른 방식으로 $("#modalElement").removeData("modal"); Bootstrap 2.3.1과 jQuery 1.9.1을 사용하고 있습니다
tlavarea

5
Bootstrap 3을 사용 hidden.bs.modal하는 hidden경우 이벤트 대신을 수신해야합니다 . getbootstrap.com/javascript/#modals
Romain Paulus

19

3.x 버전의 경우

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

2.x 버전의 경우 (위험, 아래 주석 참조) 변경되는 페이지에서 부트 스트랩 모달 세 요소를 만들 때. 따라서 모든 변경 사항을 완전히 롤백하려면 각각에 대해 수동으로 수행해야합니다.

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

수동 단계를 사용하는 것은 위험한 접근 방식입니다. 부트 스트랩 코드가 변경되고 일부 측면을 놓칠 수 있기 때문입니다. 예를 들어, 적어도 Bootstrap 3.2 에서는 숨어있는 스크롤 막대를 설명하기 위해에서 style="padding-right: 17px;"설정됩니다 body. 결론 : v3에서는 $('.modal').modal('hide').data('bs.modal', null);.
Oliver

네, 맞아요. 이것은 2.x 버전 용으로 작성되었습니다. 업데이트되었습니다.
zelibobla

동적으로 데이터를 모달에 주입하고 답변의 두 번째 부분을 모두 제거하면 필요한 것보다 훨씬 더 많이 제거됩니다. 모달 재사용의 요점을 넘어서. 도움이된다면 특정 class.remove ();
alphapilgrim

13

이렇게하면 페이지를 다시로드하지 않고도 모달을 완전히 파괴 할 수 있습니다.

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

그러나 HTML 페이지에서 모달을 완전히 제거합니다. 이 모달 숨기기 쇼 후에는 작동하지 않습니다.


.remove ()는 그것을 완전히 제거합니다. 그리고 .show ()는 더 이상 작동하지 않습니다. 다시 초기화하려면 어떻게해야합니까?
geeky_monster 2013 년

부트 스트랩 모달을 만들기 때문에 body제안 된 솔루션을 변경해도 모든 변경 사항이 롤백되지는 않습니다.
zelibobla

2
배경이 멈춰 있기 때문에 작동하지 않습니다. 왜 upvoted를 받았습니까?
codenamezero

5

나는 수락 된 대답을 시도했지만 내 쪽에서 작동하지 않는 것 같고 수락 된 대답이 어떻게 작동하는지 모르겠습니다.

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

이것은 내 편에서 완벽하게 잘 작동합니다. BS 버전> 3


이렇게하면 회색 배경이 남고 웹 페이지를 사용할 수 없게됩니다 !!
Biju

4

jQuery의 힘. $(selector).modal('hide').destroy();먼저 슬라이딩 효과가있을 수있는 sind를 제거한 다음 요소를 완전히 제거하지만 단계를 완료 한 후 사용자가 모달을 다시 열 수 있도록하려면. 모달의 모든 입력을 재설정하려면 다음과 같이 재설정하려는 설정 만 업데이트하고 싶을 수도 있습니다.

$(selector).find('input, textarea').each(function(){
   $(this).val('');
});

3

내가 이해 한 바에서 제거하거나 숨기고 싶지 않습니까? 나중에 다시 사용하고 싶을 수 있기 때문에 ..하지만 다시 열면 이전 콘텐츠를 원하지 않습니까?

<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>

동적 템플릿으로 사용하려면 다음과 같이하십시오.

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

....

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

....

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

3

부트 스트랩 3 + jquery 2.0.3 :

$('#myModal').on('hide.bs.modal', function () {
   $('#myModal').removeData();
})

1
부트 스트랩 모달을 만들기 때문에 body제안 된 솔루션을 변경해도 모든 변경 사항이 롤백되지는 않습니다.
zelibobla

3

모달에 iframe이있는 경우 다음 코드로 해당 콘텐츠를 제거 할 수 있습니다.

$('#myModal').on('hidden.bs.modal', function(){
   $(this).find('iframe').html("");
   $(this).find('iframe').attr("src", "");
});

이 날 도와 준 하나) 내가 그것을 중지하는 API를 필요로하지 않았다, 그래서
알렉사 아드리안

2

내 접근 clone()방식은 jQuery 의 방법 을 사용하는 것입니다. 그것은 당신의 요소의 사본을 생성하고 당신이 원하는 것입니다 : 당신이 원하는대로 바꿀 수있는 첫 번째 변경되지 않은 모달의 사본 : 데모 (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);
});

내가 사용한 마크 업은 가장 기본적인 것이므로 올바른 요소 / 이벤트에 바인딩하기 만하면되고 마법사를 재설정해야합니다.

주의 와 결합에 위임 이벤트 모달의 내부 요소 각각의 리셋에서, 또는 리 바인드 그 같은 방식으로 행동하라 각각의 새로운 모달.



1

버튼 클릭으로 새 모달을 여는 동일한 시나리오가있었습니다. 완료되면 내 페이지에서 완전히 제거하고 싶습니다 ... remove를 사용하여 모달을 삭제합니다 .. 버튼을 클릭하면 모달이 있는지 확인하고 true이면 제거하고 새 모달을 만듭니다.

$("#wizard").click(function() {
    /* find if wizard is already open */
    if($('.wizard-modal').length) {
        $('.wizard-modal').remove();
    }
});

1
$('#myModal').on('hidden.bs.modal', function () {
      $(this).data('bs.modal', null).remove();
});

//Just add .remove(); 
//Bootstrap v3.0.3

이 코드는 실제로 문제에 대한 해결책이 될 수 있지만 일반적으로 질문에 답할 때 수행하는 작업에 대한 설명을 포함하는 것이 좋습니다.
Sebastian Lenartowicz

확인. 나는 서둘렀다 ... 어쨌든 ".remove ();"를 추가한다. 부트 스트랩 모달의 모든 참조 및 html 코드를 제거하십시오.
Luca Di Lenardo 2017-06-20

1

이것은 DOM에서 모달을 완전히 제거하고 "추가 된"모달에서도 작동합니다.

#pickoptionmodal은 내 모달 창의 ID입니다.

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

e.preventDefault();

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

});

그 후에 모달을 다시 초기화 할 수 있습니까?
rahim.nagori

@ rahim.nagori는 설명에 쓰여있는대로 DOM에서 모달을 삭제하고 다시 추가 할 수 있습니다.
Alin Razvan

1

버튼 클릭으로 닫은 직후에 모달을 파괴해야해서 다음과 같이 생각했습니다.

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

이것은 Bootstrap 3에서 작동합니다.


1
이렇게하면 회색 배경이 남고 웹 페이지를 사용할 수 없게됩니다 !!
Biju

1

부트 스트랩 4.x에서도 작동합니다.

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

이 모달하지만 잎 웹 페이지를 사용할 수 없게 회색 배경 처분
비주

어떤 부트 스트랩 버전에서 사용해 보셨습니까?
Cristian Ghirba

0

모달 섀도우가 더 어둡고 하나 이상의 모달을 표시하지 않으면 도움이 될 것입니다.

$('.modal').live('hide',function(){
    if($('.modal-backdrop').length>1){
        $('.modal-backdrop')[0].remove();
    }
});

1
Live는 오래되어 on으로 대체되며 jQuery를 사용하는 경우 대상 요소의 [0]이 필요하지 않습니다. 당신이 완전히 배경을 제거하는 경우 또한, 당신이 다시 추가해야 할 수 있습니다 ... 시도 : $(document).on('hidden.bs.modal', '.modal', function(e) { if ($('.modal-backdrop').length) { $('.modal-backdrop').remove(); } });
토마스 베넷

0

다른 링크 클릭에 대해 동일한 모달을 사용해야했습니다. 방금 숨겨진 콜백에서 html 내용을 모달의 빈 ""으로 바꿨습니다.


0

이것은 나를 위해 일했습니다.

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

대화 상자와 배경이 사라졌지 만 다음에 버튼을 클릭했을 때 다시 돌아 왔습니다.


0

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();
});

0

이것은 나에게만 효과가 있었다

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

부트 스트랩 및 jquery 버전이이 문제의 원인 일 수 있으므로 선택기를 비워 두는 것이 안전합니다.


이렇게하면 회색 배경이 남고 웹 페이지를 사용할 수 없게됩니다 !!
Biju


-1

ui-router를 사용하면 옵션이 될 수 있습니다. 닫을 때 컨트롤러를 다시로드하므로 다음 번에 실행되기 전에 모달 콘텐츠를 다시 초기화합니다.

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

-4

이게 어떻게 들릴지 모르겠지만이게 저에게 효과가 있습니다 ...........

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

명확하게 요청되지 않은 모달을 숨기기 때문에 비추천했습니다.
AlexioVay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.