Забороніть закриття модального вікна Twitter Bootstrap


549

Я створюю модальне вікно за допомогою Twitter Bootstrap. Поведінка за замовчуванням - якщо ви натиснете за межі модальної області, модаль автоматично закриється. Я хотів би відключити це - тобто не закривати модальне вікно при натисканні поза модальним.

Чи може хтось поділитися кодом jQuery для цього?


1
У вас може бути цілком поважна причина для цього (і, ймовірно, багато інших). Однак, варто відзначити, що загалом міркування щодо UX радять проти цього - більшість користувачів очікують, що клацання з модального режиму приведе вміст "внизу" на "фронт".
Тревор

32
@Trevor Це як би протилежне модальному .
Роулінг

11
що робити, якщо на задньому плані стоїть сторінка, яку можна активувати лише в тому випадку, якщо користувач спочатку увійде в систему. Натиснувши на кнопку "Ок", користувач буде переспрямований на сторінку входу. Якщо користувач може просто натиснути кнопку, це означає, що користувач пропускає сторінку входу та просто отримує доступ до сторінки без входу. All Hell Break Loose
jumper rbk

5
@Trevor Я взагалі не бачу жодних доказів на підтвердження вашої претензії.
1252748

Ця можливість є розумною у сценарії, коли користувачеві доводиться заповнювати багато полів форми в модалі. Якщо користувач випадково натисне за межі модального модуля, всі введені дані будуть втрачені; тоді їм доведеться знову активувати модальні та заповнювати поля. Ця особливість дозволила б уникнути такого роздратування.
mickmackusa

Відповіді:


692

Я вважаю, ви хочете встановити значення фону на статичне . Якщо ви хочете уникнути закривання вікна під час використання Escключа, вам слід встановити інше значення.

Приклад:

<a data-controls-modal="your_div_id"
   data-backdrop="static"
   data-keyboard="false"
   href="#">

АБО якщо ви використовуєте JavaScript:

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

7
@ user1296175 Яким був ваш остаточний код для досягнення цього? Я хочу зробити те саме.
AlphaMale

4
Дякую @nobita, додай data-backdrop = "статичний" робить трюк! Документ завантаження у Twitter поганий :(
Blue Smith

2
Перевірте відповідь від @@ Varun Chatterji і включіть це у своє модальне визначення
Леандро

1
відключити зовнішній клік для всіх модалів з одним рядком js: $ .fn.modal.Constructor.DEFAULTS.backdrop = 'статичний';
Лукас Лієсіс

1
Для кутових користувачів: var modalInstance = $ modal.open ({templateUrl: 'modalTemplate.html', контролер: 'modalController', фон: 'статичний',});
Олександр

310

Просто встановіть backdropвластивість 'static'.

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

Ви також можете встановити keyboardвластивість, falseоскільки це не дозволяє закрити модальний клавішу натисканням Escклавіші на клавіатурі.

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

myModal ідентифікатор div, який містить ваш модальний вміст.


6
Так, це найчистіша і найпростіша відповідь (оскільки це дозволяє уникнути додавання атрибутів даних). Для довідки backdropта keyboardзгадуються тут у їхній документації під розділом Параметри .
Джессі Дюпюй

Чи варто уникати атрибутів даних? Будь ласка, керівництво з цього приводу.

@GopalAggarwal: Залежить від способу установки модалу. Якщо ви пов'язуєте модаль з декількома тегами якоря, то використання атрибутів даних може мати сенс. Але коли є лише один модуль на тег, я б перейшов із параметрами сценарію, де кожна поведінка видно в одному місці.
Nirmal

7
Також щоб уникнути модального відображення, негайно передайте шоу: false
ClearCloud8

214

Ви також можете включити ці атрибути до самого модального визначення:

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

4
Так, це найчистіша і найпростіша відповідь (адже це працює, додаючи атрибути даних). Для довідки, тло та клавіатура згадуються тут у їхній документації під розділом Параметри.
потоку

Якщо ви запускаєте модальне завантаження на сторінку, це найкращий спосіб видалити інші параметри закриття.
Санта

46

Якщо ви вже ініціалізували модальне вікно, можливо, ви захочете скинути параметри, $('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})щоб переконатися, що вони застосовуватимуть нові параметри.


1
Це мені допомогло. Після встановлення "backdrop: 'static" "користувач все ще може закрити модаль клацанням; здавався помилкою, але це зробило трюк!
Омар

7
Поки що: $ ('# modal'). RemoveData ('bs.modal'). Modal ({фон: 'статичний', клавіатура: false});
D3VELOPER

34

Замініть Bootstrap "заховати" події діалогового вікна та зупиніть його поведінку за замовчуванням (для розпорядження діалоговим вікном).

Перегляньте фрагмент коду нижче:

   $('#yourDialogID').on('hide.bs.modal', function(e) {

       e.preventDefault();
   });

У нашому випадку це прекрасно працює.


2
потім, як повернути це?
sertaconay

3
Просто елегантно. thx :) І @sertaconay просто створити булеву змінну (наприклад), яка буде перевірена, щоб вирішити, чи хочете ви запобігти за замовчуванням
Nimrod Yonatan Ben-Nes

1
Єдиний варіант, який працював після відкриття
модалу

2
Це ідеальне рішення, якщо ви хочете мати більш тонкий контроль над тим, коли модалі закриваються, а коли - ні.
Curos

33

Так, ви можете це зробити так:

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

Це ідеально підходить для випадку, коли модал оголошується в html і відкривається лише через javascript - тобто немає посилання на нього. Дякую!
hgolov

22

Начебто відповідь @ AymKdn, але це дозволить вам змінити параметри без повторної ініціалізації модалу.

$('#myModal').data('modal').options.keyboard = false;

Або якщо вам потрібно зробити кілька варіантів, JavaScript withтут стане в нагоді!

with ($('#myModal').data("modal").options) {
    backdrop = 'static';
    keyboard = false;
}

Якщо модальний режим вже відкритий, ці параметри набувають чинності лише наступного разу, коли модал відкриється.


stackoverflow.com/questions/16030448/… Але мені це рішення не подобається
Віктор

14

Просто додайте ці дві речі

data-backdrop="static" 
data-keyboard="false"

Це буде виглядати зараз

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

Це відключить кнопку втечі, а також клацання в будь-якому місці та приховання.


Ця рада була надана роками раніше.
mickmackusa

11

Ви можете відключити поведінку тла, що закривається, і зробити це за замовчуванням для всіх своїх модалів, додавши цей JavaScript на свою сторінку (переконайтеся, що він виконується після завантаження jQuery та Bootstrap JS):

$(function() {
    $.fn.modal.Constructor.DEFAULTS.backdrop = 'static';
});

6

Як каже D3VELOPER, такий код вирішує його:

$('#modal').removeData('bs.modal').modal({backdrop: 'static', keyboard: false});

Я використовую і jquery & bootstrap, і просто removeData('modal')не працюю.


4

Найкраще, що я знайшов, - додати цей код до посилання

<!-- Link -->
<a href="#mdl" role="button"  data-backdrop="static" data-keyboard="false" data-toggle="modal" id_team="" ></a>
<-- Div -->
<div id="mdl" class="modal hide fade" tabindex="-1" role="dialog" data-keyboard="false" data-backdrop="static"></div>

2

Якщо хтось приходить сюди з Google, намагаючись розібратися, як запобігти комусь закрити модаль, не забудьте, що вгорі праворуч від модаля також є кнопка закриття, яку потрібно видалити.

Я використовував деякі CSS, щоб приховати це:

#Modal .modal-header button.close {
    visibility: hidden;
}

Зауважте, що за допомогою "display: none;" перезаписується при створенні модалу, тому не використовуйте це.


Чи можете ви не просто зняти кнопку з модального заголовка?
foop

Іноді корисно використовувати CSS, а не змінювати HTML.
Дрю

2

Якщо ви хочете умовно відключити backdrop click closingфункцію. Ви можете використовувати наступний рядок, щоб встановити backdropпараметр staticпід час виконання.

Bootstrap v3.xx

jQuery('#MyModal').data('bs.modal').options.backdrop = 'static';

Bootstrap v2.xx

jQuery('#MyModal').data('modal').options.backdrop = 'static';

Це запобіжить закриттю вже створеної моделі з backdropопцією, встановленою на false( поведінка за замовчуванням ).


2

Ви можете встановити поведінку модальних параметрів за замовчуванням за допомогою нижнього рядка коду:

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

як-от +1 цей метод, я не хочу цього варіанту для всіх модалів.
Цохр

2

Зробити це дуже просто сьогодні. Просто додайте:

data-backdrop="static" data-keyboard="false" 

У модальному розділювачі.


Ця рада була надана роками раніше на цій самій сторінці.
mickmackusa

1

Ну, це ще одне рішення, яке деякі з вас, хлопці, можуть шукати (як я ..)

Моя проблема була аналогічною, модальне поле закривалося, коли завантажувався кадр, який я мав всередині, тому мені довелося вимкнути модальне відхилення, поки Iframe не завершить завантаження, а потім повторно увімкніть.

Представлені тут рішення не працюють на 100%.

Моє рішення було таким:

showLocationModal = function(loc){

    var is_loading = true;

    if(is_loading === true) {

        is_loading  = false;
        var $modal   = $('#locationModal');

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

        // prevent Modal to close before the iframe is loaded
        $modal.on("hide", function (e) {
            if(is_loading !== true) {
                e.preventDefault();
                return false
            }
        });

        // populate Modal
        $modal.find('.modal-body iframe').hide().attr('src', location.link).load(function(){

            is_loading = true;
     });
}};

Тому я тимчасово не дозволяю Modal закриватися за допомогою:

$modal.on("hide", function (e) {
    if(is_loading !== true) {
        e.preventDefault();
        return false
    }
});

Але з var is_loading це дозволить повторно закрити після завантаження iframe.


1
<button type="button" class="btn btn-info btn-md" id="myBtn3">Static 
Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal3" role="dialog">
<div class="modal-dialog">
  <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">×</button>
      <h4 class="modal-title">Static Backdrop</h4>
    </div>
    <div class="modal-body">
      <p>You cannot click outside of this modal to close it.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-
      dismiss="modal">Close</button>
    </div>
   </div>
  </div>
</div>
   <script>
    $("#myBtn3").click(function(){
     $("#myModal3").modal({backdrop: "static"});
    });
   });
  </script>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.