Làm thế nào để phá hủy hoàn toàn cửa sổ phương thức bootstrap?


83

Tôi đã sử dụng cửa sổ phương thức để triển khai trình hướng dẫn có khoảng 4,5 bước. Tôi cần hủy nó hoàn toàn sau bước cuối cùng (onFinish) và bước OnCancel mà không cần làm mới trang . Tất nhiên tôi có thể ẩn nó, nhưng ẩn cửa sổ phương thức sẽ khôi phục mọi thứ như vậy khi tôi mở lại. Bất cứ ai có thể giúp tôi về vấn đề này?

Cảm ơn Mọi câu trả lời gợi ý đều hữu ích cho tôi.


2
Bạn đang sử dụng jQuery hoặc thứ gì đó tương tự? Có thể làm được $(modal_selector).remove().
robbrit

Cảm ơn, Hãy để tôi kiểm tra xem nó có hoạt động hay không.
Akki

cảm ơn nó hoạt động nhưng nó khi chúng ta rev = invoke không được gọi bởi modal.show () .. sau đó làm thế nào để gọi lại nó?
Akki

Yeah removethực sự sẽ xóa phương thức, vì vậy nó không thể mở lại được. Cửa sổ phương thức của Twitter Bootstrap thực sự không có gì kỳ diệu, vì vậy khi bạn mở lại hộp thoại phương thức, bạn phải đặt lại tất cả các thành phần biểu mẫu theo cách thủ công (đó là kinh nghiệm của tôi).
robbrit

Nó phụ thuộc vào những gì bạn đang hiển thị trong phương thức. Twitter Bootstrap chỉ xử lý việc hiển thị phương thức, bất cứ điều gì trong đó là trách nhiệm của bạn.
robbrit

Câu trả lời:


120

nếu là bootstrap 3, bạn có thể sử dụng:

$("#mimodal").on('hidden.bs.modal', function () {
    $(this).data('bs.modal', null);
});

7
Như mọi câu trả lời khác, điều này dường như không xóa phông nền.
htulipe

1
@htulipe Cách tiếp cận là đúng nhưng nó sẽ không hoạt động với các hiệu ứng chuyển tiếp trên phương thức. Bạn sẽ cần xóa lớp .fade khỏi modal để nó hoạt động.
thợ khoan

3
@drillingman: +1 mà làm việc cho tôi:$("#mimodal").removeClass('fade').modal('hide')
John Gietzen

5
Điều duy nhất trong BS3 mà làm việc đối với tôi là:$(this).html("");
Ryan Currah

1
Chính xác thì làm thế nào để bạn xóa nó hoàn toàn? @Loenix
AlexioVay,

41

LƯU Ý: Giải pháp này chỉ hoạt động cho Bootstrap trước phiên bản 3. Để có câu trả lời cho Bootstrap 3, hãy tham khảo câu trả lời này của người dùng2612497 .

Những gì bạn muốn làm là:

$('#modalElement').on('hidden', function(){
    $(this).data('modal', null);
});

điều đó sẽ khiến phương thức tự khởi tạo mỗi khi nó được hiển thị. Vì vậy, nếu bạn đang sử dụng nội dung từ xa để tải vào div hoặc bất cứ thứ gì, nó sẽ thực hiện lại mỗi khi được mở. Bạn chỉ đang phá hủy thể hiện phương thức sau mỗi lần nó bị ẩn.

Hoặc bất cứ khi nào bạn muốn kích hoạt việc hủy phần tử (trong trường hợp không thực sự là mỗi lần bạn ẩn nó), bạn chỉ cần gọi dòng giữa:

$('#modalElement').data('modal', null);

Twitter bootstrap tìm kiếm cá thể của nó nằm trong thuộc tính dữ liệu, nếu một cá thể tồn tại, nó chỉ cần chuyển đổi nó, nếu một cá thể không tồn tại, nó sẽ tạo một cá thể mới.

Hy vọng rằng sẽ giúp.


5
Tuy nhiên, điều này thực sự hoạt động theo một cách hơi khác $("#modalElement").removeData("modal"); Tôi đang sử dụng Bootstrap 2.3.1 và jQuery 1.9.1
tlavarea

5
Nếu bạn sử dụng Bootstrap 3, bạn phải lắng nghe hidden.bs.modalthay vì hiddensự kiện. getbootstrap.com/javascript/#modals
Romain Paulus

19

Đối với phiên bản 3.x

$( '.modal' ).modal( 'hide' ).data( 'bs.modal', null );

Đối với phiên bản 2.x (rủi ro; đọc nhận xét bên dưới) Khi bạn tạo phương thức bootstrap, ba phần tử trên trang của bạn bị thay đổi. Vì vậy, nếu bạn muốn khôi phục hoàn toàn tất cả các thay đổi, bạn phải thực hiện thủ công cho từng thay đổi.

$( '.modal' ).remove();
$( '.modal-backdrop' ).remove();
$( 'body' ).removeClass( "modal-open" );

Sử dụng các bước thủ công là một cách tiếp cận rủi ro, vì mã Bootstrap có thể bị thay đổi và bạn có thể bỏ lỡ một số khía cạnh. Đối với examply, ít nhất trong Bootstrap 3.2 style="padding-right: 17px;"cũng sẽ được thiết lập trên bodythanh cuộn ẩn. Điểm mấu chốt: sử dụng API Bootstraps trong v3 $('.modal').modal('hide').data('bs.modal', null);.
Oliver,

Đúng, bạn nói đúng. Điều này được viết cho phiên bản 2.x. Đã cập nhật.
zelibobla

nếu bạn tự động nhập dữ liệu vào phương thức và bạn xóa tất cả phần thứ hai của câu trả lời của mình, nó sẽ loại bỏ nhiều hơn mức cần thiết. Ngoài quan điểm sử dụng lại phương thức. Nếu nó hữu ích, tôi khuyên bạn nên sử dụng class.remove () cụ thể của bạn;
alphapilgrim

13

Bạn hoàn toàn có thể phá hủy một phương thức mà không cần tải lại trang bằng cách này.

$("#modal").remove();
$('.modal-backdrop').remove();

nhưng nó sẽ loại bỏ hoàn toàn modal khỏi trang html của bạn. Sau khi phương thức ẩn hiện sẽ không hoạt động.


.remove () loại bỏ nó hoàn toàn. Và .show () không hoạt động nữa. Tôi phải làm gì để khởi tạo lại nó?
geeky_monster

Vì tạo phương thức bootstrap nên các thay đổi đối với bodygiải pháp được đề xuất sẽ không khôi phục tất cả các thay đổi.
zelibobla

2
Điều này sẽ không hiệu quả, bởi vì phông nền sẽ bị kẹt, tại sao nó thậm chí còn được ủng hộ?
codenamezero

5

Tôi đã thử câu trả lời được chấp nhận nhưng dường như nó không hoạt động theo hướng của tôi và tôi không biết câu trả lời được chấp nhận sẽ hoạt động như thế nào.

$('#modalId').on('hidden.bs.modal', function () {
  $(this).remove();
})

Điều này đang hoạt động hoàn toàn tốt về phía tôi. Phiên bản BS> 3


Điều này để lại phông nền màu xám cũng như khiến trang web không thể sử dụng được !!
Biju

4

Sức mạnh của jQuery. $(selector).modal('hide').destroy();trước tiên sẽ loại bỏ sinds mà bạn có thể có tác động trượt và sau đó xóa hoàn toàn phần tử, tuy nhiên nếu bạn muốn người dùng có thể mở lại phương thức sau khi bạn hoàn thành các bước. bạn có thể chỉ muốn cập nhật các cài đặt mà bạn muốn đặt lại để gửi lại tất cả các đầu vào trong phương thức của bạn, điều này sẽ giống như sau:

$(selector).find('input, textarea').each(function(){
   $(this).val('');
});

3

Theo những gì tôi hiểu, bạn không muốn xóa nó hay ẩn nó đi? Bởi vì bạn có thể muốn sử dụng lại nó sau này .. nhưng không muốn nó có nội dung cũ nếu bạn mở lại nó?

<div class="modal hide fade">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times</button>
        <h3>Modal header</h3>
    </div>
    <div class="modal-body">
        <p>One fine body…</p>
    </div>
    <div class="modal-footer">
        <a href="#" class="btn">Close</a>
        <a href="#" class="btn btn-primary">Save changes</a>
    </div>
</div>

Nếu bạn muốn sử dụng nó như một mẫu động, chỉ cần làm điều gì đó như

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

....

$(selector).modal({show: false})
$(".modal-body").empty()

....

$(".modal-body").append("new stuff & text")
$(selector).modal({show: true})

3

bootstrap 3 + jquery 2.0.3:

$('#myModal').on('hide.bs.modal', function () {
   $('#myModal').removeData();
})

1
Vì tạo phương thức bootstrap nên các thay đổi đối với bodygiải pháp được đề xuất sẽ không khôi phục tất cả các thay đổi.
zelibobla

3

Nếu bạn có iframe trong phương thức của mình, bạn có thể xóa nội dung của nó bằng mã sau:

$('#myModal').on('hidden.bs.modal', function(){
   $(this).find('iframe').html("");
   $(this).find('iframe').attr("src", "");
});

này là một trong đó đã giúp tôi;) vì vậy tôi không cần một api cho dừng nó
Alexa Adrian

2

Cách tiếp cận của tôi là sử dụng clone()phương thức của jQuery. Nó tạo ra một bản sao của phần tử của bạn và đó là những gì bạn muốn: một bản sao của phương thức không thay đổi đầu tiên của bạn, mà bạn có thể thay thế theo ý muốn của mình: Demo (jsfiddle)

var myBackup = $('#myModal').clone();

// Delegated events because we make a copy, and the copied button does not exist onDomReady
$('body').on('click','#myReset',function() {
    $('#myModal').modal('hide').remove();
    var myClone = myBackup.clone();
    $('body').append(myClone);
});

Đánh dấu tôi đã sử dụng là cơ bản nhất, vì vậy bạn chỉ cần liên kết trên các phần tử / sự kiện phù hợp và bạn sẽ đặt lại trình hướng dẫn của mình.

Hãy cẩn thận liên kết với các sự kiện được ủy quyền hoặc rebind ở mỗi lần đặt lại các phần tử bên trong của phương thức của bạn để mỗi phương thức mới hoạt động theo cùng một cách.



1

Tôi đã có một tình huống tương tự, nơi tôi sẽ mở một phương thức mới chỉ bằng một lần bấm nút. Sau khi hoàn tất, tôi muốn xóa hoàn toàn nó khỏi trang của mình ... Tôi sử dụng remove để xóa phương thức .. Khi nhấp vào nút, tôi sẽ kiểm tra xem phương thức có tồn tại không và nếu đúng, tôi sẽ hủy nó và tạo một phương thức mới ..

$("#wizard").click(function() {
    /* find if wizard is already open */
    if($('.wizard-modal').length) {
        $('.wizard-modal').remove();
    }
});

1
$('#myModal').on('hidden.bs.modal', function () {
      $(this).data('bs.modal', null).remove();
});

//Just add .remove(); 
//Bootstrap v3.0.3

Mặc dù trên thực tế, đoạn mã này có thể là một giải pháp cho vấn đề, nhưng nhìn chung, bạn nên đưa vào phần giải thích những gì nó thực hiện khi bạn trả lời một câu hỏi.
Sebastian Lenartowicz

Đồng ý. Tôi đang vội ... dù sao hãy thêm ".remove ();" để xóa tất cả tham chiếu và mã html của phương thức bootstrap của bạn.
Luca Di Lenardo

1

Điều này loại bỏ hoàn toàn phương thức khỏi DOM, cũng đang hoạt động cho các phương thức "được thêm vào".

#pickoptionmodal là id của cửa sổ phương thức của tôi.

$(document).on('hidden.bs.modal','#pickoptionmodal',function(e){

e.preventDefault();

$("#pickoptionmodal").remove();

});

Sau đó, phương thức có thể được khởi tạo lại không?
rahim.nagori

@ rahim.nagori như nó viết trong phần mô tả là xóa modal khỏi DOM, bạn có thể thêm lại nó ... không phải là đang đóng modal, đang xóa anh ta, chủ đề là về hủy hoàn toàn cửa sổ modal.
Alin Razvan

1

Tôi phải phá hủy phương thức ngay sau khi nó được đóng lại thông qua một lần nhấp vào nút, và vì vậy tôi đã nghĩ ra những điều sau.

$("#closeModal").click(function() {
    $("#modal").modal('hide').on('hidden.bs.modal', function () {
        $("#modal").remove();
    });
});

Lưu ý rằng điều này hoạt động với Bootstrap 3.


1
Điều này để lại phông nền màu xám cũng như khiến trang web không thể sử dụng được !!
Biju

1

Cũng hoạt động trên bootstrap 4.x

$('#modal_ID').modal( 'hide' ).data( 'bs.modal', null );

Điều này loại bỏ phương thức nhưng để lại phông nền màu xám khiến trang web không thể sử dụng được
Biju

Bạn đã thử phiên bản bootstrap nào?
Cristian Ghirba

0

Nếu bóng của phương thức vẫn tối hơn và không hiển thị nhiều hơn một phương thức thì điều này sẽ hữu ích

$('.modal').live('hide',function(){
    if($('.modal-backdrop').length>1){
        $('.modal-backdrop')[0].remove();
    }
});

1
Trực tiếp đã lỗi thời, cần được thay thế bằng bật và [0] trên phần tử bạn đang nhắm mục tiêu không cần thiết nếu bạn đang sử dụng jQuery. Ngoài ra, nếu bạn loại bỏ các bối cảnh hoàn toàn, lưu ý bạn có thể phải thêm nó trở lại ... Hãy thử: $(document).on('hidden.bs.modal', '.modal', function(e) { if ($('.modal-backdrop').length) { $('.modal-backdrop').remove(); } });
Thomas Bennett

0

Tôi đã phải sử dụng cùng một phương thức cho các lần nhấp vào liên kết khác nhau. Tôi vừa thay thế nội dung html bằng trống "" của phương thức trong lệnh gọi lại ẩn.


0

Điều này đã làm việc cho tôi.

$('.modal-backdrop').removeClass('in');
$('#myDiv').removeClass('in');

Hộp thoại và phông nền đã biến mất, nhưng chúng trở lại vào lần sau khi tôi nhấp vào nút.


0

Nó hoạt động cho Bootstrap v3.3.6

$('#dialog').modal()
.on('hide.bs.modal', function () {
    // Some Code
}).on('shown.bs.modal', function () {
    // Some Code
}).on('hidden.bs.modal', function () {
    $("#dialog").off();
});

0

chỉ điều này làm việc cho tôi

$('body').on('hidden.bs.modal', '.modal', function() {
    $('selector').val('');
});

Thật an toàn khi buộc các bộ chọn để trống vì phiên bản bootstrap và jquery có thể là lý do của sự cố này


Điều này để lại phông nền màu xám cũng như khiến trang web không thể sử dụng được !!
Biju

0

Loại bỏ hoàn toàn một dòng khi ẩn (ES6)

$("#myModal").on('hidden.bs.modal', (e)=>e.currentTarget.remove());


-1

Với ui-router, đây có thể là một lựa chọn cho bạn. Nó tải lại bộ điều khiển khi đóng để khởi động lại nội dung phương thức trước khi kích hoạt lần sau.

$("#myModalId").on('hidden.bs.modal', function () {
  $state.reload();  //resets the modal
});

-4

Tôi không biết điều này nghe có vẻ như thế nào nhưng điều này phù hợp với tôi ...........

$("#YourModalID").modal('hide');

Bị phản đối vì nó chỉ ẩn phương thức những gì rõ ràng không được hỏi.
AlexioVay
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.