時々すばやく入力のテキスト全体を(モーダル内で)選択したいとき、テキストの最後から選択を開始し、マウスを動かしますテキスト全体が選択されるまで左に移動し、次に解放します。
マウスの動きが速いため、このreleaseがモーダルの外で発生することがあります。
動きを説明する画像:
問題は、私が外にリリースするとモーダルが閉じられることです。
質問:外部にリリースするときにモーダルが閉じないようにするにはどうすればよいですか?
私はモーダルが外側のクリックで閉じられても大丈夫です。しかし、リリースイベントでは問題です。
私が使用しています:
更新:plunkrとGIFを作成しました: https://plnkr.co/edit/mxDLAdnrQ4p0KKyw?p=info
<div class="modal-body">
<div class="form-group">
<label for="">Foo</label>
<input type="text" class="form-control input-sm" ng-model="foo">
<p>Do this: select the text from right to left and release the mouse outside the modal.</p>
</div>
</div>
GIF:
更新2
新しい情報があります!これは、最後のGoole Chromeの更新後に発生し始めました!以前のバージョンのChromeとモーダルは閉じません。
Bootstrap.jsとbootstrap.min.jsの「Modal.js」を参照するコードのみを更新しました
修正バージョン:
* Bootstrap: modal.js v3.4.1
* https://getbootstrap.com/docs/3.4/javascript/#modals
この問題は最近ではなく、githubですでに言及されています
https://github.com/angular-ui/bootstrap/issues/581
次の解決策は、必要に応じて小さな改善を加えても非常にうまく機能します。
$rootScope.$watch(() => document.querySelectorAll('.modal').length, val => {
//everytime the number of modals changes
for (let modal of document.querySelectorAll('.modal')) {
if ($uibModalStack.getTop().value.backdrop !== 'static') { // Testing if the
modal is supposed to be static before attaching the event
modal.addEventListener('mousedown', e => {
if (e.which === 1) {
$uibModalStack.getTop().key.dismiss()
}
})
modal.querySelector('.modal-content').addEventListener('mousedown', e => {
e.stopPropagation()
})
}
}
if (val > 0) {
$uibModalStack.getTop().value.backdrop = 'static'
}
})
モーダルのドラッグ可能なフッターとヘッダーを保持する同じ原理の別のソリューション
$rootScope.$watch(function () {
return $document.find('.modal').length;
}, function (val) {
if(openedWindows.top() ) {
var modal = $document.find('.modal');
angular.forEach(modal, function(value) {
if ($modalStack.getTop().value.backdrop !== 'static') {
value.addEventListener('mousedown', function (e) {
if (value === e.target && e.which === 1 && openedWindows.top()) {
$modalStack.getTop().key.dismiss();
}
});
}
});
if (val>0) {
$modalStack.getTop().value.backdrop = 'static';
}
}
});
はい、これは最後のGoole Chromeアップデートバージョン74.0.3729.169の後に発生しました。これはChromeのバグであり、修正できず、 Chrome更新が完了するまで待つ必要がありますか?
またはbootstrapメンテナはこれを修正するためにコードを更新しますか?
//prevent modal close when click starts in modal and ends on backdrop
$(document).on('mousedown', '.modal', function(e){
window.clickStartedInModal = $(e.target).is('.modal-dialog *');
});
$(document).on('mouseup', '.modal', function(e){
if(!$(e.target).is('.modal-dialog *') && window.clickStartedInModal) {
window.preventModalClose = true;
}
});
$("#modal").on("hide.bs.modal", function (e) {
if(window.preventModalClose){
window.preventModalClose = false;
return false;
}
});
範囲スライダーでも同様の状況でした。モーダルの外側のスライド中にクリックを残すと、モーダルが閉じます。だから私はdata-toggle="modal"
およびdata-target="#mymodal"
と追加のパラメーターを含むクリックイベントを追加
jQuery('button#modal_toggler').click(function(){
jQuery('#myModal').modal({
backdrop: 'static',
keyboard: false
})
})
backdrop
外側をクリックしたときのモーダル終了を無効にするkeyboard
これは私のシナリオで、モーダルを閉じるためのキーボード入力を無効にします
backdrop: 'static'
を使用してみましたか。これでうまくいくと思います。それはドキュメントにあります here
モーダルウィンドウの周囲にcssパディングを追加し、サイズを大きくします。外側をクリックしても機能しますが、エッジ上でドラッグしているときにマウスを離しても閉じません。