Twitterのブートストラップモーダルダイアログを使用しています。ブートストラップモーダルダイアログの送信ボタンをクリックすると、AJAXリクエストが送信されます。私の問題は、モーダル背景が消えないことです。モーダルダイアログは正しく消えますが、代わりに画面に不透明度を作成する「モーダル背景」が残ります
私に何ができる?
Twitterのブートストラップモーダルダイアログを使用しています。ブートストラップモーダルダイアログの送信ボタンをクリックすると、AJAXリクエストが送信されます。私の問題は、モーダル背景が消えないことです。モーダルダイアログは正しく消えますが、代わりに画面に不透明度を作成する「モーダル背景」が残ります
私に何ができる?
AJAXリクエストを実行するときは、実際のモーダルウィンドウを含むコンテナを置き換えないようにしてください。これは、ブートストラップがコンテナを閉じようとしたときに、そのコンテナへの参照を見つけることができないためです。Ajaxコンプリートハンドラーでモーダルを削除してから、データを置き換えます。
それが機能しない場合は、次の手順を実行することで、いつでも強制的に削除できます。
$('#your-modal-id').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();
$.modal()
モーダル動作を適用するための最初の呼び出しが、意図したよりも多くの要素を渡していないことを確認してください。これが発生した場合、コレクション内の各要素に対して、背景要素を備えたモーダルインスタンスを作成することになります。その結果、実際に複製の1つを見ていると、背景が残されているように見える場合があります。
私の場合、次のようなコードを使用して、モーダルコンテンツをオンザフライで作成しようとしていました。
myModal = $('<div class="modal">...lots of HTML content here...</div><!-- end modal -->');
$('body').append(myModal);
myModal.modal();
ここで、終了タグの後のHTMLコメント</div>
は、myModalが実際にはdivとコメントの2つの要素のjQueryコレクションであることを意味していました。それらは両方とも忠実にモーダルに変換され、それぞれが独自の背景要素を持っています。もちろん、コメントで作ったモーダルは背景以外は見えないので、本物のモーダル(div)を閉じると背景が残っているように見えました。
私はこの問題にあまりにも長い時間を費やしました:)
提供された他の回答は有用で有効ですが、Bootstrapからモーダル非表示機能を効果的に再現することは私には少し厄介に思えたので、よりクリーンな解決策を見つけました。
問題は、電話をかけると一連のイベントが発生することです
$("#myModal").modal('hide');
functionThatEndsUpDestroyingTheDOM()
その後、AJAXリクエストの結果として一連のHTMLを置き換えると、モーダル非表示イベントは終了しません。ただし、Bootstrapはすべてが終了したときにイベントをトリガーするため、次のようにフックできます。
$("#myModal").modal('hide').on('hidden.bs.modal', functionThatEndsUpDestroyingTheDOM);
これがお役に立てば幸いです。
アクションボタンにこれを挿入します:
data-backdrop="false"
と
data-dismiss="modal"
例:
<button type="button" class="btn btn-default" data-dismiss="modal">Done</button>
<button type="button" class="btn btn-danger danger" data-dismiss="modal" data-backdrop="false">Action</button>
このdata-attrを入力すると、.modal-backdropは表示されません。このリンクのドキュメント:http://getbootstrap.com/javascript/#modals-usage
私はこれが非常に古い投稿であることを知っていますが、これは役立つかもしれません。これは私による非常に小さな回避策です
$('#myModal').trigger('click');
それだけです、これで問題は解決するはずです
getboostrapサイト自体からhtmlで生成されたセレクターにコピーアンドペーストを使用している場合は、コメント'<!-/.modal->'を必ず削除してください。ブートストラップは混乱し、コメントは2番目のモーダル要素であると考えます。この「2番目の」要素に別のバックドロップを作成します。
同様の問題が発生しました。モーダルウィンドウに、[キャンセル]と[OK]の2つのボタンがあります。元々、両方のボタンが呼び出してモーダルウィンドウを閉じ$('#myModal').modal('hide')
(以前に「OK」でコードを実行していた場合)、シナリオは次のようになります。
さて、私の隣のデスクは私の一日を救いました。呼び出す代わりに$('#myModal').modal('hide')
、ボタンに属性を与え、data-dismiss="modal"
「送信」ボタンに「クリック」イベントを追加します。私の問題では、ボタンのHTML(TWIG)コードは次のとおりです。
<button id="modal-btn-ok" class="btn" data-dismiss="modal">OK</button>
<button id="modal-btn-cancel" class="btn" data-dismiss="modal">Cancel</button>
私のJavaScriptコードには、次のものがあります。
$("#modal-btn-ok").one("click", null, null, function(){
// My stuff to be done
});
「キャンセル」ボタンに起因する「クリック」イベントはありません。モーダルが適切に閉じ、「通常の」ページでもう一度再生できるようになりました。実際にはdata-dismiss="modal"
、ボタン(または任意のDOM要素)がブートストラップモーダルを閉じる必要があることを示す唯一の方法であるように思われます。この.modal('hide')
メソッドは、完全に制御可能な方法では動作しないようです。
お役に立てれば!
この問題は、モーダルウィンドウを非表示にしてから再度表示するのが速すぎる場合にも発生する可能性があります。これは質問のために他の場所で言及されましたが、以下でもう少し詳しく説明します。
問題はタイミングとフェードトランジションに関係しています。前のモーダルのフェードアウト遷移が完了する前にモーダルを表示すると、この永続的な背景の問題が発生します(モーダルの背景は画面に残ります)。Bootstrapは、複数の同時モーダルを明示的にサポートしていませんが、非表示にしているモーダルと表示しているモーダルが同じであっても、これは問題のようです。
これが問題の正しい理由である場合、問題を軽減するためのいくつかのオプションがあります。オプション#1は、フェードトランジションのタイミングが実際に問題の原因であるかどうかを判断するための迅速で簡単なテストです。
関連するブートストラップ問題追跡システムの投稿をいくつか示します。以下にリストしたよりも多くのトラッカー投稿がある可能性があります。
.modal('hide')
モーダルを手動で非表示にします。モーダルが実際に非表示になる前(つまり、hidden.bs.modalイベントが発生する前)に呼び出し元に戻ります。
だから代わりに
$('#myModal').modal('hide');
$('#someOtherSelector').trigger('click');
行う
$('#myModal').modal('hide');
$('#myModal').on('hidden.bs.modal', function() {
$('#someOtherSelector').trigger('click');
});
したがって、「非表示」イベントが終了するまで必ず待機してください。
この問題を引き起こす可能性のある別の考えられる間違い、
bootstrap.js
ページにスクリプトを2回以上含めていないことを確認してください。
同様の問題が発生した場合でも、次の2つのボタンがありました
<button id="confirm-delete-btn" >Yes, Delete this note.</button>
<button id="confirm-delete-cancel" data-dismiss="modal">No</button>
いくつかのajax操作を実行したかったのですが、そのajax操作が成功したら、モーダルを閉じます。これが私がしたことです。
$.ajax({
url: '/ABC/Delete/' + self.model.get("Id")
, type: 'DELETE'
, success: function () {
setTimeout(function () {
self.$("#confirm-delete-cancel").trigger("click");
}, 1200);
}
, error: function () {}
});
プロパティを持つ「いいえ」ボタンのクリックイベントをトリガーしましたdata-dismiss="modal"
。そしてこれはうまくいきました:)
$('#myModal')。trigger('クリック');
これは私のために働いた。ポップアップを開くと、2つまたは3つのモーダル背景がトリガーされるため、閉じません。したがって、$('#myModal'))。modal('hide');を実行すると 1つのモーダル背景にのみ影響し、残りは残ります。
このソリューションは、Ruby on Rails 3.xと、モーダルを含むDOMの一部を再構築するjs.erbファイル用です。ajax呼び出しがモーダルから来たのか、ページの別の部分から来たのかに関係なく機能します。
if ($("#my-modal").attr("aria-hidden") === "false") {
$("#my-modal").modal('hide').on('hidden.bs.modal', function (event) {
functionThatEndsUpDestroyingTheDOM();
});
} else {
functionThatEndsUpDestroyingTheDOM();
}
出発点として@BillHuertasに感謝します。
data-dismiss="modal"
私のモーダルにボタンを追加すると、うまくいきました。ボタンで角度のある関数を呼び出してajax呼び出しを起動し、モーダルを閉じる必要があったので.toggle()
、関数内にを追加するとうまく機能しました。(私の場合、実際のモーダルコントローラーではなく、bootstrap modal
を使用し、いくつかを使用しました)。angular
<button type="button" class="btn btn-primary" data-dismiss="modal"
ng-click="functionName()"> Do Something </button>
$scope.functionName = function () {
angular.element('#modalId').toggle();
$.ajax({ ajax call })
}
最高評価のソリューションを適用した後、将来のモーダルが適切に開くのを壊すという問題がありました。私はうまくいく私の解決策を見つけました
element.on("shown.bs.modal", function () {
if ($(".modal-backdrop").length > 1) {
$(".modal-backdrop").not(':first').remove();
}
element.css('display', 'block');
});
updatepanelの問題。
私の問題は、updatepanelの配置が原因でした。更新パネルにモーダル全体がありました。更新パネルの外でモーダルを宣言し、更新パネルでモーダル本体と言うだけの場合、$('#myModalID')。modal('hide'); 働いた。
この質問に対する別の見方。(私はbootstrap.jsバージョン3.3.6を使用しています)
javascriptで手動でモーダルを初期化するのを間違えました:
$('#myModal').modal({
keyboard: false
})
とを使用して
data-toggle="modal"
以下の例のようなこのボタンで(ドキュメントに表示)
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Launch demo modal</button>
その結果、次の2つのインスタンスが作成されます。
<div class="modal-backdrop fade in"></div>
モーダルを開くときに、HTMLの本文に追加します。これは、関数を使用してモーダルを閉じるときに発生する可能性があります。
$('#myModal').modal('hide');
(上記のように)背景インスタンスを1つだけ削除して、背景が消えないようにします。しかしdata-dismiss="modal"
、ブートストラップドキュメントのshowとしてadd on htmlを使用すると、表示されなくなりました。
したがって、私の問題の解決策は、JavaScriptでモーダルを手動で初期化するだけで、データ属性を使用しないことです。このようにして、モーダルを手動で閉じることも、data-dismiss="modal"
機能を使用して閉じることもできます。
あなたが私と同じ問題に遭遇した場合、これが役立つことを願っています。
参考までに、誰かがまだこれに遭遇した場合に備えて...私はそれを行うための最良の方法が次のとおりであることを発見するために約3時間を費やしました:
$("#my-modal").modal("hide");
$("#my-modal").hide();
$('.modal-backdrop').hide();
$("body").removeClass("modal-open");
モーダルを閉じるその関数は非常に直感的ではありません。
.net MVC4プロジェクトでは、Ajax.BeginForm(OnComplete = "addComplete" [余分なコードが削除されました])内にモーダルポップアップ(ブートストラップ3.0)がありました。「addComplete」javascriptの中に、次のコードがありました。これで私の問題は解決しました。
$('#moreLotDPModal')。hide();
$( "#moreLotDPModal")。data('bs.modal')。isShown = false;
$('body')。removeClass('modal-open');
$('。modal-backdrop')。remove();
$('#moreLotDPModal')。removeClass( "in");
$('#moreLotDPModal')。attr('aria-hidden'、 "true");
私も同じ問題を抱えていました。BootstrapとJQueryUIの競合が原因であることがわかりました。
どちらもクラス「close」を使用します。いずれかのクラスを変更すると、これが修正されます。
非表示の代わりにトグルを使用して、私の問題を解決しました
モーダルコンポーネントに関係のない要素については、他の場所で同じ要素ID/クラスを使用していないことを確認してください。
つまり、クラス名'myModal'を使用してモーダルポップアップをトリガーするボタンを識別する場合は、同じクラス名を持つ無関係の要素がないことを確認してください。
私にとって、最良の答えはこれです。
<body>
<!-- All other HTML -->
<div>
...
</div>
<!-- Modal -->
<div class="modal fade" id="myModal">
...
</div>
モーダルマークアップの配置 他のコンポーネントがモーダルの外観や機能に影響を与えないように、常にモーダルのHTMLコードをドキュメントの最上位の位置に配置するようにしてください。
このSOの答えから
フォームを送信しようとしたときに同じ問題が発生しました。解決策は、ボタンの種類をからに変更してsubmit
からbutton
、次のようにボタンクリックイベントを処理することでした。
'click .js-save-modal' () {
$('#myFormId').submit();
$('#myModalId').modal('hide');
}
私はこれとまったく同じ問題を抱えていました。
ただし、bootbox.jsを使用していたので、それと関係がある可能性があります。
いずれにせよ、この問題は、親と同じクラスの要素が原因で発生していることに気付きました。これらの要素の1つを使用してクリック関数をバインドし、モーダルを表示すると、問題が発生します。
つまり、これが問題の原因です。
<div class="myElement">
<div class="myElement">
Click here to show modal
</div>
</div>
クリックされている要素が、その親、子、または他の祖先と同じクラスを持たないように変更します。クリック関数をバインドするときは、一般的にこれを行うことをお勧めします。
Meteorを使用していますが、同じ問題が発生しました。私のバグの原因はこれでした:
{{#if tourmanager}}
{{>contactInformation tourmanager}}
{{else}}
<a href="#addArtistTourmanagerModal" data-toggle="modal"><i class="fa fa-plus"></i> Tourmanager toevoegen</a>
{{>addArtistTourmanagerModal}}
{{/if}}
ご覧のとおり、elseにモーダルを追加したので、モーダルが連絡先情報を更新したときに、ifに別の状態がありました。これにより、モーダルテンプレートが閉じる直前にDOMから除外されました。
解決策:モーダルをif-elseから移動します。
{{#if tourmanager}}
{{>contactInformation tourmanager}}
{{else}}
<a href="#addArtistTourmanagerModal" data-toggle="modal"><i class="fa fa-plus"></i> Tourmanager toevoegen</a>
{{>addArtistTourmanagerModal}}
{{/if}}
//Create modal appending on body
myModalBackup = null;
$('#myModal').on('hidden.bs.modal', function(){
$('body').append(myModalBackup.clone());
myModalBackup = null;
});
//Destroy, clone and show modal
myModalBackup = $('#myModal').clone();
myModalBackup.find('.modal-backdrop').remove();
$('#myModal').modal('hide').remove();
myModalBackup.find('.info1').html('customize element <b>1</b>...');
myModalBackup.find('.info2').html('customize element <b>2</b>...');
myModalBackup.modal('show');
data-backdrop属性の初期値は次のようになります。
「静的」、「真」、「偽」。
staticとtrueはモーダルシャドウを追加し、falseはシャドウを無効にするため、最初のクリックでこの値をfalseに変更する必要があります。このような:
$(document).on('ready',function(){
var count=0;
$('#id-which-triggers-modal').on('click',function(){
if(count>0){
$(this).attr('data-backdrop','false')
}
count++;
});
});
モーダル背景画面のフリーズの問題がありましたが、少し異なるシナリオでした。2つの連続したモーダルが表示されていたとき。たとえば、最初は何かをするための確認を求め、「確認」ボタンがクリックされた後、アクションはエラーに遭遇し、2番目のモーダルが表示されてエラーメッセージがポップアップ表示されます。2番目のモーダル背景は画面をフリーズします。要素のクラス名またはIDに衝突はありませんでした。
問題が修正された方法は、モーダル背景を処理するのに十分な時間をブラウザに与えることでした。「確認」をクリックした直後にアクションを実行する代わりに、ブラウザに500msと言って、最初のモーダルを非表示にし、背景などをクリーンアップします。次に、エラーモーダルを表示するアクションを実行します。
<button type="button" class="btn btn-red" data-dismiss="modal" on-tap="_dialogConfirmed">Confirm</button>
...
_dialogConfirmed()関数のコードは次のとおりです。
var that = this;
setTimeout(function () {
if (that.confirmAction) {
(that.confirmAction)();
that.confirmAction = undefined;
}
}, 500);
他の解決策は、ブラウザに必要なクリーンアップ時間を与えるのに十分な余分な時間がかかったため、うまくいったと思います。
ASP.NETで、jqueryコマンドの後にコードビハインドでUpdatePanelの更新を追加します。例:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "myModal", "$('#myModal').modal('hide');", true);
upModal.Update();
https://github.com/twbs/bootstrap/issues/19385から
Modalのshow/hideメソッドは非同期です。したがって、次のようなコード:
foo.modal("hide"); bar.modal("show");
無効です。表示/非表示が実際に完了するのを待ってから(表示/非表示のイベントをリッスンします 。http: //getbootstrap.com/javascript/#modals-eventsを参照)、showまたはhideメソッドを再度呼び出す必要があります。
同じモーダルを2回開くのが速すぎると、この問題が発生したため、簡単な修正は、すでに表示されているかどうかを確認してから、再度表示しないようにすることでした。
$('#modalTitle').text(...);
$('#modalMessage').text(...);
if($('#messageModal').is(':hidden')){
$('#messageModal').modal('show');
}
これを試して
$('#something_clickable').on('click', function () {
$("#my_modal").modal("hide");
$("body").removeClass("modal-open");
$('.modal-backdrop').remove();
});
それは私にとってはうまくいきます。
私も同様の問題を抱えていました。BoostrapをBackboneと組み合わせて使用していて、[実行]ボタンのクリックをキャプチャして、それらのイベントの伝播を停止していました。奇妙なことに、これによりモーダルは消えましたが、背景は消えませんでした。event.preventDefault()を呼び出しても、stopPropagation()を呼び出さない場合、すべて正常に機能します。
多くの検索を行った後のこのコード行は、ajaxの成功でモーダルを閉じたいという私の問題を解決しました。
$('#exampleModal').modal('hide');
$("[data-dismiss=modal]").trigger({ type: "click" });
どうもありがとう、マヌエルフェルナンド https://stackoverflow.com/a/27218322/5935763
最近私はこの問題を抱えていましたが、ここで提供されている解決策はどれも役に立ちませんでした。または、完全に破壊されたため、再度表示できませんでした。ドキュメントの準備も機能しませんでしたが、機能したのは、次のようなすぐに呼び出される関数ですべてのリスナーをラップしたことです。
$(function () {
$('#btn-show-modal').click(function () {
$("#modal-lightbox").modal('show');
});
$('#btn-close-modal').click(function () {
$("#modal-lightbox").modal('hide');
});
});
他の答え(有用で有効な)を簡単に適用できない場合があります。次に、考えられる回避策は、モーダルダイアログが消えた直後にモーダル背景のクリックをトリガーするイベントを実装することです。
次のモーダルダイアログに基づく例を次に示します。
<div class="modal fade ..." id="IdOfMyModal" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true">
...
</div>
モーダルをクリックしたときに「モーダル背景入力」(画面に背景の不透明度を作成する)を削除するには、次のコードを追加します。
$('#IdOfMyModal').on("click", function() {
setTimeout(function() {
if ($('#IdOfMyModal').css("opacity") != "1")
$('.modal-backdrop').trigger('click');
}, 100);
});
すべての答えを調べた後、私は包括的な解決策を思いつきました。結局、これが私のために働いた唯一のものです。(バニラJavaScript):
var elem = document.querySelectorAll('[data-dismiss="modal"]')[0];
var evt = new Event('click');
elem.dispatchEvent(evt);
var modalelem = document.getElementById('exampleModalCenter');
var myModal = new bootstrap.Modal(modalelem, { keyboard: false })
const fade = modalelem.classList.contains('fade');
if (fade) {
modalelem.classList.remove('fade');
}
myModal.hide();
myModal.dispose();
var backdrop = document.getElementsByClassName('modal-backdrop')[0];
backdrop.style.display = 'none';
var modalopen = document.getElementsByClassName('modal-open')[0];
modalopen.classList.remove('modal-open');
modalopen.style.removeProperty("overflow");\