Отключить клик за пределами модальной области начальной загрузки, чтобы закрыть модальную


441

Я делаю сайт начальной загрузки, с парой Bootstrap 'Modals'. Я пытаюсь настроить некоторые функции по умолчанию.

Проблема в этом; Вы можете закрыть модальные, нажав на фон. Есть ли способ отключить эту функцию? Только на указанные модалы?

Bootstrap модальная страница


Подскажите, пожалуйста, какое событие вызывается в этой ситуации. $ scope.ok, $ scope. $ dismiss У меня есть реализация для отправки и отмены, но я не знаю, произошло ли событие в этой ситуации.
LoveToCode

Ответы:


914

В разделе «Опции» на странице, на которую вы ссылаетесь, вы можете увидеть backdropопцию. Передача этой опции со значением 'static'предотвратит закрытие модального окна.
Как указал @PedroVagner на комментарии, вы также можете перейти, {keyboard: false}чтобы предотвратить закрытие модального режима нажатием Esc.

Если вы открываете модал с помощью js, используйте:

$('#myModal').modal({backdrop: 'static', keyboard: false})  

Если вы используете атрибуты данных, используйте:

 <button data-target="#myModal" data-toggle="modal" data-backdrop="static" data-keyboard="false">
    Launch demo modal
 </button>`

Есть ли способ сохранить фон в состоянии регистрировать щелчки для других элементов управления, но не закрывать модалы?
Вивеканон

2
@mystikacid Вы должны задать новый вопрос для этого. Будет лучше помочь вам с вашей проблемой и другими пользователями, которые ищут подобное решение.
Догита


3
У вас была простая, но раздражающая проблема, убедитесь, что вы разместили строку jquery, прежде чем $('#modal').modal('show');Надеюсь, что это поможет!
cwiggo

3
cwiggo вы не используете модальные $ ('# modal'). modal ('show'); - вы просто используете .modal ({фон: 'статический', клавиатура: ложь}) - без какой-либо команды показа или переключения
TV-C-15

136

Это самый простой

Вы можете определить свое модальное поведение, определяя данные клавиатуры и фона данных.

<div id="modal" class="modal hide fade in" data-keyboard="false" data-backdrop="static">

2
Это единственное, что сработало для меня. По какой-то причине передача параметров в JS напрямую не работала для меня (версия 3.3.7). Если кто-нибудь еще подтвердит, я могу открыть вопрос с командой Bootstrap.
Дчаке

Сначала использование js-версии не работало для меня, потому что я настраивал все после того, как открыл модал. Вы должны сделать это "$ ('# modalForm'). Modal ({фон: 'статический', клавиатура: ложь});" перед этим "$ ('# modalForm'). modal ('show');". Но для меня лучший ответ от @ ಅನಿಲ್
Лукас

Это сработало для меня. Поместив data-backdrop="static"опцию в определение модальной, а не триггерную кнопку, которая открывает модальную, как указано в других ответах, у меня сработало.
TSmith

99

Вы можете использовать атрибут как это: data-backdrop="static"или с javascript:

$('#myModal').modal({
    backdrop: 'static',
    keyboard: false  // to prevent closing with Esc button (if you want this too)
})

См. Также этот ответ: запретить закрытие модального окна начальной загрузки Twitter


<div id = "modal" class = "модальное скрытие исчезновения" data-keyboard = "false" data-background = "static"> это лучший ответ.
Kamlesh

34

В моем приложении я использую приведенный ниже фрагмент кода, чтобы показать модальность Bootstrap через jQuery.

 $('#myModall').modal({
                        backdrop: 'static',
                        keyboard: true, 
                        show: true
                }); 

Это хороший ответ, потому что этот код будет работать только тогда, когда открыт модальный режим.
Дипак Дхолиян

32

Ты можешь использовать

$.fn.modal.prototype.constructor.Constructor.DEFAULTS.backdrop = 'static';
$.fn.modal.prototype.constructor.Constructor.DEFAULTS.keyboard =  false;

изменить поведение по умолчанию.


Отличный ответ, так как он справляется с ситуацией для всех модалов.
Харис ур Рехман

1
В начальной загрузке v4 синтаксис: $ .fn.modal.prototype.constructor.Constructor.Default.backdrop = 'static';
Гарри Английский

11

Есть два способа отключить щелчок за пределами области модели начальной загрузки, чтобы закрыть

  1. используя JavaScript

    $('#myModal').modal({
       backdrop: 'static',
       keyboard: false
    });
  2. использование атрибута данных в теге HTML

    data-backdrop="static" data-keyboard="false" //write this attributes in that button where you click to open the modal popup.

9

Оформить заказ ::

$(document).ready(function() {
    $("#popup").modal({
        show: false,
        backdrop: 'static'
    });
    
    $("#click-me").click(function() {
       $("#popup").modal("show");             
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/css/bootstrap.css" rel="stylesheet"/>
<script src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.0/css/bootstrap-combined.min.css" rel="stylesheet">
        </head>
    <body>
        <div class="modal" id="popup" style="display: none;">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h3>Standard Selectpickers</h3>
            </div>
            <div class="modal-body">
                
                <select class="selectpicker" data-container="body">
                    <option>Mustard</option>
                    <option>Ketchup</option>
                    <option>Relish</option>
                </select>

            </div>
            <div class="modal-footer">
                <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
                <button class="btn btn-primary">Save changes</button>
            </div>
        </div>
        <a id="click-me" class="btn btn-primary">Click Me</a> 
    </body>
        <script type="text/javascript" src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.0/js/bootstrap.min.js"></script>
</html>


6

Другой вариант, если вы не знаете, был ли модальный режим уже открыт или нет, и вам нужно настроить модальные параметры:

Bootstrap 3.4

var $modal = $('#modal');
var keyboard = false; // Prevent to close by ESC
var backdrop = 'static'; // Prevent to close on click outside the modal

if(typeof $modal.data('bs.modal') === 'undefined') { // Modal did not open yet
    $modal.modal({
        keyboard: keyboard,
        backdrop: backdrop
    });
} else { // Modal has already been opened
    $modal.data('bs.modal').options.keyboard = keyboard;
    $modal.data('bs.modal').options.backdrop = backdrop;

    if(keyboard === false) { 
        $modal.off('keydown.dismiss.bs.modal'); // Disable ESC
    } else { // 
        $modal.data('bs.modal').escape(); // Resets ESC
    }
}

Bootstrap 4.3+

var $modal = $('#modal');
var keyboard = false; // Prevent to close by ESC
var backdrop = 'static'; // Prevent to close on click outside the modal

if(typeof $modal.data('bs.modal') === 'undefined') { // Modal did not open yet
    $modal.modal({
        keyboard: keyboard,
        backdrop: backdrop
    });
} else { // Modal has already been opened
    $modal.data('bs.modal')._config.keyboard = keyboard;
    $modal.data('bs.modal')._config.backdrop = backdrop;

    if(keyboard === false) { 
        $modal.off('keydown.dismiss.bs.modal'); // Disable ESC
    } else { // 
        $modal.data('bs.modal').escape(); // Resets ESC
    }
}

Измените параметры на _config


для Bootstrap 4+ должно быть _setEscapeEvent()вместо .escape()?
Иван

@IvanBacher работает для меня, используя .escape ()
Cava

5

Решение, которое работает для меня, заключается в следующем:

$('#myModal').modal({backdrop: 'static', keyboard: false})  

задний план: отключено событие клика снаружи

клавиатура: отключено событие ключевого слова scape


4
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-keyboard="false" data-backdrop="static">

попробуйте это, во время разработки моего приложения ... Я также столкнулся с проблемой, что значения по умолчанию для атрибута модели => data-keyboard="true", =>data-backdrop="non static"

Надеюсь, что это поможет вам!




1

ни одно из этих решений не помогло мне.

У меня есть модальные условия и положения, которые я хотел заставить людей просмотреть, прежде чем продолжить ... значения по умолчанию "статический" и "клавиатура" в соответствии с параметрами сделали невозможным прокрутить страницу вниз, так как условия и положения - это несколько страниц лог, статика не была ответом для меня.

Так что вместо этого я пошел, чтобы отменить привязку метода click на модале, с помощью следующего я смог получить желаемый эффект.

$('.modal').off('click');


0
You can Disallow closing of #signUp (This should be the id of the modal) modal when clicking outside of modal.
As well as on ESC button.
jQuery('#signUp').on('shown.bs.modal', function() {
    jQuery(this).data('bs.modal').options.backdrop = 'static';// For outside click of modal.
    jQuery(this).data('bs.modal').options.keyboard = false;// For ESC button.
})

0

Если вы используете @ ng-bootstrap, используйте следующее:

Составная часть

import { Component, OnInit } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.scss'],
})
export class ExampleComponent implements OnInit {

  constructor(
    private ngbModal: NgbModal
  ) {}

  ngOnInit(): void {
  }

  openModal(exampleModal: any, $event: any) {
    this.ngbModal.open(exampleModal, {
      size: 'lg', // set modal size
      backdrop: 'static', // disable modal from closing on click outside
      keyboard: false, // disable modal closing by keyboard esc
    });
  }
}

шаблон

<div (click)="openModal(exampleModal, $event)"> </div>
    <ng-template #exampleModal let-modal>
        <div class="modal-header">
            <h5 class="modal-title">Test modal</h5>
        </div>
        <div class="modal-body p-3">
            <form action="">
                <div class="form-row">
                    <div class="form-group col-md-6">
                        <label for="">Test field 1</label>
                        <input type="text" class="form-control">
                    </div>
                    <div class="form-group col-md-6">
                        <label for="">Test field 2</label>
                        <input type="text" class="form-control">
                    </div>

                    <div class="text-right pt-4">
                        <button type="button" class="btn btn-light" (click)="modal.dismiss('Close')">Close</button>
                        <button class="btn btn-primary ml-1">Save</button>
                    </div>
            </form>
        </div>
    </ng-template>

Этот код был протестирован на угловых 9 с использованием:

  1. "@ ng-bootstrap / ng-bootstrap": "^ 6.1.0",

  2. "bootstrap": "^ 4.4.1",


0

Используйте это, если вы хотите отключить внешний клик для всех модалов, используя jQuery. Добавьте этот скрипт в свой Javascript после jQuery.

jQuery(document).ready(function () {
    jQuery('[data-toggle="modal"]').each(function () {
       jQuery(this).attr('data-backdrop','static');
       jQuery(this).attr('data-keyboard','false');
    });
});

-1

Вы также можете сделать это без использования JQuery, например так:

<div id="myModal">

var modal = document.getElementById('myModal');
modal.backdrop = "static";
modal.keyboard = false;

-2

Добавьте ниже CSS согласно вашей ширине экрана.

@media (min-width: 991px){
    .modal-dialog {
        margin: 0px 179px !important;
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.