ブートストラップモーダルウィンドウを完全に破壊する方法は?


83

約4.5ステップのウィザード実装にモーダルウィンドウを利用しました。最後のステップ(onFinish)とOnCancelステップので、ページを更新せずに完全に破棄する必要があります。もちろん非表示にすることもできますが、モーダルウィンドウを非表示にすると、もう一度開いたときにすべてが復元されます。誰かがこの問題について私を助けてくれますか?

ありがとうどんなヒントの答えも私に役立ちます。


2
jQueryなどを使用していますか?できるかもしれません$(modal_selector).remove()
robbrit 2012年

ありがとう、それが機能するかどうかを確認させてください。
akki 2012年

おかげで動作しますが、rev = invokeがmodal.show()..によって呼び出されない場合、どのように再起動しますか?
akki 2012年

ええremove、モーダルは本当に削除されるので、再び開くことはできません。Twitter Bootstrapのモーダルウィンドウは実際には魔法のようなものではないため、モーダルダイアログを再度開くときは、すべてのフォーム要素を手動でリセットする必要があります(これは私の経験です)。
robbrit 2012年

モーダルに何を表示しているかによって異なります。Twitter Bootstrapは、モーダルの表示のみを処理します。その中にあるものはすべて、ユーザーの責任です。
robbrit 2012年

回答:


120

ブートストラップ3の場合、次を使用できます。

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

7
他のすべての答えと同様に、これは背景を取り除くようには見えません。
htulipe 2013年

1
@htulipeアプローチは正しいですが、モーダルの遷移効果では機能しません。動作させるには、モーダルから.fadeクラスを削除する必要があります。
掘削

3
@drillingman:私のために働いた+1:$("#mimodal").removeClass('fade').modal('hide')
John Gietzen 2014年

5
BS3で私のために働いたのは:$(this).html("");
Ryan Currah 2014

1
どのくらい正確にそれを完全に削除しますか?@Loenix
AlexioVay

41

注:このソリューションは、バージョン3より前のBootstrapでのみ機能します。Bootstrap3の回答については、user2612497これを参照しください。

あなたがしたいことは:

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

これにより、モーダルは表示されるたびに初期化されます。したがって、リモートコンテンツを使用してdivなどにロードしている場合は、開くたびに再実行されます。モーダルインスタンスが非表示になるたびに、モーダルインスタンスを破棄しているだけです。

または、要素の破棄をトリガーする場合は常に(実際に非表示にするたびではない場合)、真ん中の行を呼び出す必要があります。

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

Twitterブートストラップは、データ属性にあるインスタンスを探します。インスタンスが存在する場合は、インスタンスを切り替えるだけです。インスタンスが存在しない場合は、新しいインスタンスを作成します。

お役に立てば幸いです。


5
これは実際には機能しますが、$("#modalElement").removeData("modal"); Bootstrap2.3.1と
jQuery1.9.1

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バージョンの場合(危険です。以下のコメントをお読みください)ブートストラップモーダルを作成すると、ページ上に3つの要素が変更されます。したがって、すべての変更を完全にロールバックする場合は、変更ごとに手動で行う必要があります。

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

ブートストラップコードが変更され、いくつかの側面を見逃す可能性があるため、手動の手順を使用することは危険なアプローチです。たとえば、少なくともBootstrap 3.2style="padding-right: 17px;"では、非表示のbodyスクロールバーを考慮して同様に設定されます。結論:v3では$('.modal').modal('hide').data('bs.modal', null);。になるBootstrapsAPIを使用します。
オリバー

はい、その通りです。これは2.xバージョン用に書かれています。更新しました。
zelibobla 2015年

データをモーダルに動的に挿入し、回答の2番目の部分をすべて削除すると、必要以上にデータが削除されます。モーダルを再利用するという点を超えて。それが役立つ場合は、特定のclass.remove();を使用することをお勧めします。
alphapilgrim 2015年

13

この方法では、ページをリロードせずにモーダルを完全に破棄できます。

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

ただし、HTMLページからモーダルが完全に削除されます。このモーダルハイドショーの後は機能しません。


.remove()はそれを完全に削除します。そして、.show()はもう機能しません。もう一度初期化するにはどうすればよいですか?
geeky_monster 2013年

ブートストラップモーダルを作成するため、body提案されたソリューションに変更を加えても、すべての変更がロールバックされるわけではありません。
zelibobla 2013年

2
背景が動かなくなるので、これは機能しません。なぜそれが賛成されたのですか?
codenamezero

5

受け入れられた回答を試しましたが、うまく機能していないようで、受け入れられた回答がどのように機能するのかわかりません。

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

これは私の側では完全にうまく機能しています。BSバージョン> 3


これにより、背景が灰色になり、Webページが使用できなくなります。
Biju

4

jQueryの力。$(selector).modal('hide').destroy();最初にスライド効果がある可能性のあるシンドを削除し、次に要素を完全に削除します。ただし、手順の完了後にユーザーがモーダルを再び開くことができるようにする場合。リセットしたい設定のみを更新したい場合があるので、モーダルのすべての入力をリセットするには、次のようになります。

$(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 2013年

3

モーダルにiframeがある場合は、次のコードでそのコンテンツを削除できます。

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

これは私を助けたものでした;)それで私はそれを止めるためのAPIを必要としませんでした
Alexa Adrian

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

OK。私は急いでいました...とにかく「.remove();」を追加してください ブートストラップモーダルのすべての参照とhtmlコードを削除します。
Luca Di Lenardo 2017年

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

これはBootstrap3で機能することに注意してください。


1
これにより、背景が灰色になり、Webページが使用できなくなります。
Biju


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

0

リンクのクリックごとに同じモーダルを使用する必要がありました。htmlコンテンツを非表示のコールバックのモーダルの空の ""に置き換えました。


0

これは私のために働いた。

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

ダイアログと背景は消えましたが、次にボタンをクリックしたときに戻ってきました。


0

Bootstrapv3.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バージョンがこの問題の原因である可能性があるため、セレクターを強制的に空白にするのは安全です。


これにより、背景が灰色になり、Webページが使用できなくなります。
Biju


-1

ui-routerを使用すると、これはオプションになる場合があります。クローズ時にコントローラーをリロードするため、次回起動する前にモーダルコンテンツを再初期化します。

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

-4

これがどのように聞こえるかはわかりませんが、これは私にとってはうまくいきます..........。

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

明らかに求められなかったものをモーダルに隠すだけなので、反対票を投じました。
AlexioVay 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.