Không cho phép cửa sổ chế độ Twitter Bootstrap đóng


549

Tôi đang tạo một cửa sổ phương thức bằng Twitter Bootstrap. Hành vi mặc định là nếu bạn nhấp bên ngoài khu vực phương thức, phương thức sẽ tự động đóng lại. Tôi muốn vô hiệu hóa điều đó - tức là không đóng cửa sổ phương thức khi nhấp bên ngoài phương thức.

Ai đó có thể chia sẻ mã jQuery để làm điều này?


1
Bạn có thể có một lý do hoàn toàn hợp lệ để làm điều này (và có khả năng nhiều người khác). Tuy nhiên, điều đáng chú ý là nói chung, các cân nhắc của UX sẽ khuyên điều này - hầu hết người dùng mong đợi rằng việc nhấp vào một phương thức sẽ đưa nội dung "bên dưới" lên "mặt trận".
Trevor

32
@Trevor Điều đó giống như đối lập với phương thức .
Rawling

11
Điều gì xảy ra nếu, nếu có một trang ở chế độ nền chỉ có thể được kích hoạt nếu người dùng đăng nhập trước. Bằng cách nhấp vào nút phương thức Ok, người dùng sẽ được chuyển hướng đến trang đăng nhập. Nếu người dùng chỉ có thể nhấp vào, điều này có nghĩa là người dùng bỏ qua trang đăng nhập và chỉ truy cập trang mà không cần đăng nhập. All Hell Break Loose
jumper rbk

5
@Trevor Tôi không thấy bất kỳ bằng chứng nào để hỗ trợ cho yêu cầu của bạn.
1252748

Tính năng này hợp lý trong một kịch bản khi người dùng phải điền vào nhiều trường mẫu trong phương thức. Nếu người dùng vô tình nhấp chuột bên ngoài của các phương thức, sau đó tất cả các chi tiết vào sẽ bị mất; sau đó họ sẽ phải kích hoạt lại phương thức và nạp lại các trường. Tính năng này sẽ tránh được sự kích thích như vậy.
mickmackusa

Câu trả lời:


692

Tôi tin rằng bạn muốn đặt giá trị nền thành tĩnh . Nếu bạn muốn tránh cửa sổ đóng khi sử dụng Escphím, bạn phải đặt giá trị khác.

Thí dụ:

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

HOẶC nếu bạn đang sử dụng JavaScript:

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

7
@ user1296175 Mã cuối cùng của bạn để đạt được điều này là gì? Tôi muốn làm như vậy.
AlphaMale

4
Cảm ơn bạn @nobita, thêm data-backdrop = "static" thực hiện thủ thuật! Tài liệu bootstrap của Twitter rất kém :(
Blue Smith

2
Kiểm tra câu trả lời từ @@ Varun Chatterji và đưa câu hỏi này vào định nghĩa phương thức của bạn
Leandro

1
vô hiệu hóa nhấp chuột bên ngoài cho tất cả các phương thức với một dòng js: $ .fn.modal.Constructor.DEFAULTS.backdrop = 'static';
Lukas Liesis

1
Đối với người dùng Angular: var modalInstance = $ modal.open ({templateUrl: 'modalTemplate.html', bộ điều khiển: 'modalContoder', backdrop: 'static',});
Alexandr

310

Chỉ cần đặt backdroptài sản để 'static'.

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

Bạn cũng có thể muốn đặt thuộc keyboardtính thành falsevì điều đó ngăn chế độ bị đóng bằng cách nhấn Escphím trên bàn phím.

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

myModal là ID của div chứa nội dung phương thức của bạn.


6
Đúng, đây là câu trả lời sạch nhất, đơn giản nhất (vì nó tránh thêm thuộc tính dữ liệu). Để tham khảo, backdropkeyboardđược đề cập ở đây trong tài liệu của họ trong phần Tùy chọn .
Jesse Dupuy

Là thuộc tính dữ liệu một cái gì đó để tránh? Vui lòng hướng dẫn về điều này.

@GopalAggarwal: Phụ thuộc vào cách bạn thiết lập phương thức. Nếu bạn liên kết một phương thức với nhiều thẻ neo, thì việc sử dụng các thuộc tính dữ liệu có thể có ý nghĩa. Nhưng khi chỉ có một phương thức cho mỗi thẻ, tôi sẽ đi với các tham số tập lệnh trong đó mọi hành vi được hiển thị ở một nơi.
Nirmal

7
Ngoài ra, để tránh chế độ hiển thị ngay lập tức vượt qua trong chương trình: false
ClearCloud8

214

Bạn cũng có thể bao gồm các thuộc tính này trong chính định nghĩa phương thức:

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

4
Đúng, đây là câu trả lời đơn giản nhất, sạch nhất (vì nó hoạt động bằng cách thêm các thuộc tính dữ liệu). Để tham khảo, phông nền và bàn phím được đề cập ở đây trong tài liệu của họ trong phần Tùy chọn.
chảy

Nếu bạn khởi chạy phương thức khi tải trang, đây là cách tốt nhất để loại bỏ các tùy chọn đóng khác.
santa

46

Nếu bạn đã khởi tạo cửa sổ phương thức, thì bạn có thể muốn đặt lại các tùy chọn $('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})để đảm bảo nó sẽ áp dụng các tùy chọn mới.


1
Điều này đã giúp tôi ra ngoài. Sau khi đặt "phông nền: 'tĩnh'", người dùng vẫn có thể đóng chế độ bằng một cú nhấp chuột; Có vẻ như là một lỗi, nhưng điều này đã lừa
Omar

7
Hiện tại: $ ('# modal'). RemoveData ('bs.modal'). Modal ({backdrop: 'static', keyboard: false});
D3VELOPER

34

Ghi đè sự kiện 'ẩn' của Bootstrap và dừng hành vi mặc định của nó (để loại bỏ hộp thoại).

Vui lòng xem đoạn mã dưới đây:

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

       e.preventDefault();
   });

Nó hoạt động tốt trong trường hợp của chúng tôi.


2
Sau đó, làm thế nào để hoàn nguyên nó?
sertaconay

3
Vừa thanh lịch. thx :) Và @sertaconay chỉ cần tạo một biến boolean (ví dụ) sẽ được kiểm tra để quyết định xem bạn có muốn ngăn chặn mặc định hay không
Nimrod Yonatan Ben-Nes

1
tùy chọn duy nhất ở đây hoạt động sau khi một phương thức bị phản đối
hỏi_io

2
Đây là một giải pháp hoàn hảo nếu bạn muốn kiểm soát tốt hơn khi các phương thức có thể đóng được và khi nào thì không.
Curos

33

Vâng, bạn có thể làm điều đó như thế này:

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

Điều này là hoàn hảo cho trường hợp phương thức được khai báo trong html và chỉ được mở thông qua javascript - tức là không có liên kết đến nó. Cảm ơn!
hgolov

22

Kiểu như câu trả lời của @ AymKdn, nhưng điều này sẽ cho phép bạn thay đổi các tùy chọn mà không cần khởi tạo lại phương thức.

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

Hoặc nếu bạn cần thực hiện nhiều tùy chọn, JavaScript sẽ withcó ích ở đây!

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

Nếu phương thức đã được mở, các tùy chọn này sẽ chỉ có hiệu lực vào lần tiếp theo phương thức được mở.


stackoverflow.com/questions/16030448/ Mạnh Nhưng tôi không thích giải pháp này mặc dù
Victor

14

Chỉ cần thêm hai điều này

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

Nó sẽ trông như thế này bây giờ

<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">

Nó sẽ vô hiệu hóa nút thoát và cũng nhấp vào bất cứ đâu và ẩn.


Lời khuyên này đã được cung cấp nhiều năm trước đó.
mickmackusa

11

Bạn có thể vô hiệu hóa hành vi nhấp để đóng của nền và biến nó thành mặc định cho tất cả các phương thức của bạn bằng cách thêm JavaScript này vào trang của bạn (đảm bảo nó được thực thi sau khi tải jQuery và Bootstrap):

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

6

Như D3VELOPER nói, đoạn mã sau giải quyết nó:

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

Tôi đang sử dụng cả jquery & bootstrap và đơn giản là removeData('modal')không hoạt động.


4

Điều tốt nhất tôi tìm thấy là thêm mã này vào liên kết

<!-- 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

Trong trường hợp bất kỳ ai đến đây từ Google đang cố gắng tìm ra cách ngăn ai đó đóng một phương thức, đừng quên rằng cũng có một nút đóng ở phía trên bên phải của phương thức cần được gỡ bỏ.

Tôi đã sử dụng một số CSS để ẩn nó:

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

Lưu ý rằng sử dụng "display: none;" bị ghi đè khi phương thức được tạo, vì vậy đừng sử dụng nó.


Bạn có thể không loại bỏ nút khỏi tiêu đề phương thức không?
foop

Đôi khi nó có lợi khi sử dụng CSS thay vì thay đổi HTML.
vẽ

2

Nếu bạn muốn vô hiệu hóa backdrop click closingtính năng này. Bạn có thể sử dụng dòng sau để đặt backdroptùy chọn statictrong thời gian chạy.

Bootstrap v3.xx

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

Bootstrap v2.xx

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

Điều này sẽ ngăn một mô hình đã được khởi tạo với backdroptùy chọn được đặt thành false( hành vi mặc định ), đóng lại.


2

Bạn có thể đặt hành vi mặc định của cửa sổ bật lên phương thức bằng cách sử dụng dòng mã bên dưới:

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

Giống như +1 phương thức này, tôi không muốn tùy chọn đó cho tất cả các phương thức.
tsohr

2

Làm điều đó là rất dễ dàng ngày nay. Chỉ cần thêm:

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

Trong bộ chia phương thức của bạn.


Lời khuyên này đã được cung cấp nhiều năm trước trên cùng trang này.
mickmackusa

1

Chà, đây là một giải pháp khác mà một số bạn có thể đang tìm kiếm (như tôi đã ..)

Vấn đề của tôi cũng tương tự, hộp modal đã đóng trong khi iframe tôi có bên trong đang tải, vì vậy tôi phải vô hiệu hóa loại bỏ modal cho đến khi Iframe kết thúc tải, sau đó kích hoạt lại.

Các giải pháp được trình bày ở đây không hoạt động 100%.

Giải pháp của tôi là thế này:

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

Vì vậy, tôi tạm thời ngăn Modal đóng lại với:

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

Nhưng đó là var is_loading sẽ cho phép đóng lại sau khi Iframe được tải.


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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.