Làm cách nào để ẩn phương thức Bootstrap với javascript?


281

Tôi đã đọc các bài đăng ở đây, trang web Bootstrap và được cho là như điên - nhưng không thể tìm thấy những gì tôi chắc chắn là một câu trả lời dễ dàng ...

Tôi có một phương thức Bootstrap mà tôi mở từ một người trợ giúp link_to như thế này:

<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal",  class: "btn btn-primary"} %>

Trong ContactsController.createhành động của tôi , tôi có mã tạo ra Contactsau đó chuyển sang create.js.erb. Trong create.js.erb, tôi có một số mã xử lý lỗi (hỗn hợp ruby ​​và javascript). Nếu mọi thứ suôn sẻ, tôi muốn đóng phương thức.

Đây là nơi tôi gặp khó khăn. Tôi dường như không thể loại bỏ phương thức khi mọi việc suôn sẻ.

Tôi đã thử $('#myModal').modal('hide');và điều này không có kết quả. Tôi cũng đã thử $('#myModal').hide();làm cho phương thức loại bỏ nhưng rời khỏi bối cảnh.

Bất kỳ hướng dẫn về cách đóng chế độ và / hoặc loại bỏ phông nền từ bên trong create.js.erb?

Biên tập

Đây là đánh dấu cho myModal:

<div class="modal hide" id="myModal" >
  <div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Add Contact</h3>
    <div id="errors_notification">
    </div>
  </div>
  <div class="modal-body">
    <%= form_for :contact, url: contacts_path, remote: true do |f| %>  
      <%= f.text_field :first_name, placeholder: "first name" %>
      <%= f.text_field :last_name, placeholder: "last name" %>
      <br>
      <%= f.submit "Save", name: 'save', class: "btn btn-primary" %>
      <a class="close btn" data-dismiss="modal">Cancel</a>
    <% end %>
  </div>
  <div class="modal-footer">
  </div>
</div>

1
$('#myModal').modal('hide');là cú pháp đúng để đóng / ẩn phương thức với id myModal(bạn có thể kiểm tra điều này trên trang tài liệu Bootstrap ). Bạn có chắc chắn bạn có một yếu tố với id này trên trang của bạn? Ngoài ra, bạn đang cố gắng thực hiện điều gì với cuộc gọi này? Việc triển khai hiện tại của bạn thực hiện một yêu cầu Ajax đến new_contact_pathvà đồng thời mở phương thức với nội dung của #myModal- đây có phải là điều bạn muốn không?
Julian D.

Xin chào, Julian. Tôi đã đăng đánh dấu myModal ở trên và thực sự có một div với id myModal. Tôi đã thử lại $('myModal').modal('hide')và vẫn không tốt. HM. Về những gì tôi đang cố gắng thực hiện, tôi nghĩ rằng có thể không chính xác khi sử dụng trình trợ giúp link_to. Tôi đã thay thế điều này bằng: <a data-toggle="modal" href="#myModal" class="btn btn-primary">Add Contact</a>vì tôi không thực sự cần một cuộc gọi đến new_contact_path. Tôi chỉ muốn phương thức mở và sau đó xử lý đầu vào của người dùng. Cảm ơn đã dành thời gian trả lời. Tôi sẽ xem nếu tôi không thể sắp xếp cái này ra.
jvillian

Tôi đoán đó chỉ là một lỗi đánh máy, nhưng cuộc gọi nên là $('#myModal').modal('hide');(có một #thiếu sót trong bình luận của bạn).
Julian D.

1
Xấu của tôi để gõ thay vì sao chép từ mã thực tế. Mã thực tế đọc : $('#myModal').modal('hide'). J
jvillian

Bạn có thể thử sử dụng bootboxjs
md. ahsan ariful

Câu trả lời:


493

Với chế độ mở trong cửa sổ trình duyệt, hãy sử dụng bảng điều khiển của trình duyệt để thử

$('#myModal').modal('hide');

Nếu nó hoạt động (và phương thức đóng) thì bạn biết rằng Javascript gần của bạn không được gửi từ máy chủ đến trình duyệt một cách chính xác.

Nếu nó không hoạt động thì bạn cần điều tra thêm về khách hàng những gì đang xảy ra. Ví dụ: đảm bảo rằng không có hai phần tử có cùng id. Ví dụ, nó hoạt động lần đầu tiên sau khi tải trang nhưng không phải lần thứ hai?

Bảng điều khiển của trình duyệt: fireorms cho firefox, bảng điều khiển gỡ lỗi cho Chrome hoặc Safari, v.v.


Đoạn thứ hai là những gì tôi đang tìm kiếm. ID trùng lặp đã khiến các phương thức của tôi không hiển thị chính xác lần thứ hai.
Matias

Điều này đã khắc phục vấn đề cho tôi. Cảm ơn.
Finchy70

77

để đóng phương thức bootstrap, bạn có thể chuyển 'ẩn' làm tùy chọn cho phương thức phương thức như sau

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

Xin hãy xem fiddle làm việc ở đây

bootstrap cũng cung cấp các sự kiện mà bạn có thể kết nối với chức năng phương thức , như nếu bạn muốn kích hoạt một sự kiện khi phương thức kết thúc bị ẩn khỏi người dùng, bạn có thể sử dụng sự kiện hidden.bs.modal bạn có thể đọc thêm về các phương thức và sự kiện phương thức ở đây trong Tài liệu

Nếu phương pháp trên không hoạt động, hãy đưa id vào nút đóng của bạn và kích hoạt nhấp vào nút đóng.


1
Điều này đặc biệt hữu ích khi bạn biết chính xác tại thời điểm nào hộp thoại phương thức được cho là đóng. Ví dụ ở cuối một chức năng thành công. Bằng cách đó nếu có lỗi, hộp thoại có thể hiển thị nó.
Sẽ

47

Tôi sử dụng Bootstrap 3.4 Đối với tôi điều này không hoạt động

$('#myModal').modal('hide')

Trong tuyệt vọng, tôi đã làm điều này:

$('#myModal').hide();
$('.modal-backdrop').hide();

Có thể nó không thanh lịch, nhưng nó hoạt động


2
Sẽ tốt hơn nếu bạn sử dụng $ (". Modal-backdrop"). Remove ();
Bloodhound

1
Điều này sẽ giới thiệu các lỗi mới. vui lòng sử dụng các phương pháp được đề xuất,
Benjamin Eckstein

jQuery ('. modal-backdrop'). click ();

lỗi nhỏ nhưng chắc chắn hoạt động. Giải pháp của Manuel Fernando dưới đây đã làm việc hoàn hảo cho tôi.
Munam Yousuf

@Umingo vui lòng giới thiệu một phương pháp nếu những cái được đề cập ở đây không tốt và bạn biết một phương pháp.
khoảng

47

Hình thức tốt nhất để ẩn và hiển thị một phương thức với bootstrap

// SHOW
$('#ModalForm').modal('show');
// HIDE
$('#ModalForm').modal('hide');

Câu trả lời tốt nhất cho đến nay. Mô phỏng hành vi với các nhấp chuột, jQuery fadeOut hoặc css có thể tạo ra các sai lệch trong thời gian dài.
Giorgio Tempesta

43

Tôi đã gặp phải lỗi tương tự và dòng mã này thực sự giúp tôi.

$("[data-dismiss=modal]").trigger({ type: "click" });

1
Tôi đã đọc một vấn đề khác cho thấy vấn đề có thể có thuộc tính loại bỏ dữ liệu trên phần tử, sau đó, trên hết cố gắng kích hoạt nó từ javascript
Femtosecond

Rất nhiều Rất nhiều người cảm ơn Manuel, điều này sau rất nhiều tìm kiếm đã giải quyết vấn đề của tôi, $ ('# MyModelId'). Modal ('ẩn'); $ ("[data-notify = modal]"). trigger ({type: "click"}); rằng tôi muốn đóng modal trên ajax thành công .... thực sự cảm ơn rất nhiều
abdelrhman raafat

22
$('#modal').modal('hide'); 
//hide the modal

$('body').removeClass('modal-open'); 
//modal-open class is added on body so it has to be removed

$('.modal-backdrop').remove();
//need to remove div with modal-backdrop class

nó đã hoạt động, nhưng đã phá vỡ phương thức nếu tôi mở lại phương thức không cuộn nữa
kosas

21

Tôi tìm thấy giải pháp chính xác bạn có thể sử dụng mã này

$('.close').click(); 

giải pháp tốt nhất cho đến nay
kosas

tuyệt vời chỉ đơn giản là +1 tốt nhất
MooMoo

11

Tôi gặp phải những gì tôi tin là một vấn đề tương tự. Có $('#myModal').modal('hide');khả năng chạy qua chức năng đó và chạm vào dòng

if (!this.isShown || e.isDefaultPrevented()) return

Vấn đề là giá trị isShown có thể không được xác định ngay cả khi phương thức được hiển thị và giá trị phải là đúng. Tôi đã sửa đổi mã bootstrap một chút thành như sau

if (!(typeof this.isShown == 'undefined') && (!this.isShown || e.isDefaultPrevented())) return

Điều này dường như để giải quyết vấn đề cho hầu hết các phần. Nếu phông nền vẫn còn, bạn luôn có thể thêm một cuộc gọi để xóa thủ công sau cuộc gọi ẩn $('.modal-backdrop').remove();. Không lý tưởng chút nào nhưng không hoạt động.


11

(Tham khảo Bootstrap 3), Để ẩn phương thức sử dụng : $('#modal').modal('hide'). Nhưng lý do bối cảnh treo xung quanh (đối với tôi) là vì tôi đã phá hủy DOM cho phương thức trước khi 'ẩn' kết thúc.

Để giải quyết vấn đề này, tôi đã xâu chuỗi sự kiện ẩn bằng cách xóa DOM. Trong trường hợp của tôi:this.render()

var $modal = $('#modal');

//when hidden
$modal.on('hidden.bs.modal', function(e) { 
  return this.render(); //DOM destroyer
});

$modal.modal('hide'); //start hiding

1
nhưng bạn có thể vui lòng cho tôi biết về this.render()nó hiển thị undefined is not a functiontrong bảng điều khiển chrome của tôi.
Anil Kumar Pandey

9

Tôi đã may mắn hơn khi thực hiện cuộc gọi sau khi cuộc gọi lại "hiển thị" xảy ra:

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

Điều này đảm bảo phương thức được tải xong trước khi cuộc gọi ẩn () được thực hiện.


8

Những gì chúng tôi tìm thấy là chỉ có một chút chậm trễ giữa cuộc gọi đến mã máy chủ của chúng tôi và sự trở lại cuộc gọi thành công trở lại. Nếu chúng tôi kết thúc cuộc gọi đến máy chủ trong $("#myModal").on('hidden.bs.modal', function (e)trình xử lý và sau đó gọi$("#myModal").modal("hide"); phương thức, trình duyệt sẽ ẩn phương thức và sau đó gọi mã phía máy chủ.

Một lần nữa, không thanh lịch nhưng chức năng.

 function myFunc(){
        $("#myModal").on('hidden.bs.modal', function (e) {
            // Invoke your server side code here.
        });
        $("#myModal").modal("hide");
 };

Như bạn có thể thấy, khi myFuncđược gọi, nó sẽ ẩn phương thức và sau đó gọi mã phía máy chủ.


6

Tôi đã trải qua vấn đề tương tự, và sau một chút thử nghiệm tôi đã tìm thấy một giải pháp. Trong trình xử lý nhấp chuột của tôi, tôi cần phải ngăn sự kiện nổi lên, như vậy:

$("a.close").on("click", function(e){
  $("#modal").modal("hide");
  e.stopPropagation();
});

6

Đây là tài liệu: http://getbootstrap.com/javascript/#modals-methods

Đây là phương thức: $ ('# myModal'). Modal ('ẩn')

Nếu bạn cần mở nhiều lần phương thức với nội dung khác nhau, tôi đề nghị thêm (trong bạn chính js):

$('body').on('hidden.bs.modal', '.modal', function () {
      $(this).removeData('bs.modal');
    });

Vì vậy, bạn sẽ làm sạch nội dung cho lần mở tiếp theo và tránh một loại bộ nhớ đệm


6
$('.modal-backdrop').hide(); // for black background
$('body').removeClass('modal-open'); // For scroll run
$('#modal').modal('hide'); 

5

Ngay cả tôi cũng có loại vấn đề tương tự. Điều này đã giúp tôi rất nhiều

$("[data-dismiss=modal]").trigger({ type: "click" });


4

$('#modal').modal('hide');và các biến thể của nó không hoạt động với tôi trừ khi tôi có data-dismiss="modal"một thuộc tính trên nút Hủy. Giống như bạn, nhu cầu của tôi là có thể đóng / có thể - không đóng dựa trên một số logic bổ sung nên việc nhấp vào một liên kết data-dismiss="modal"hoàn toàn sẽ không làm được. Cuối cùng tôi đã có một nút ẩn data-dismiss="modal"mà tôi có thể lập trình gọi trình xử lý nhấp chuột từ đó, vì vậy

<a id="hidden-cancel" class="hide" data-dismiss="modal"></a>
<a class="close btn">Cancel</a>

và sau đó bên trong trình xử lý nhấp để hủy khi bạn cần đóng chế độ bạn có thể có

$('#hidden-cancel').click();

Trong trường hợp của tôi (trang dao cạo asp net) tôi đã sử dụng nó tương tự như OP: tôi có một div hơi trống với lớp "modal" và tự động thêm một tệp cshtml vào nó, ví dụ như thân modal và thêm một lần nhấp vào nút này cơ thể ngay khi phương thức sẽ được hiển thị. chỉ gọi ".modal ('ẩn)" là không đủ, như bạn đã chỉ ra: "data-notify =" modal "" trên nút gọi là thỏa thuận !!! ty
Csharpest

3

Chúng ta cần phải chăm sóc bong bóng sự kiện. Cần thêm một dòng mã

$("#savechanges").on("click", function (e) {
        $("#userModal").modal("hide");
        e.stopPropagation(); //This line would take care of it
    });

3

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi thấy rằng không ai trong số này thực sự là những gì tôi đang tìm kiếm chính xác. Nó dường như được gây ra bằng cách cố gắng đóng chế độ trước khi nó hiển thị xong.

Giải pháp của tôi dựa trên câu trả lời của @ schoonie23 nhưng tôi phải thay đổi một vài thứ.

Đầu tiên, tôi đã khai báo một biến toàn cục ở đầu tập lệnh của mình:

<script>
    var closeModal = false;
    ...Other Code...

Sau đó, trong mã phương thức của tôi:

$('#myModal').on('show.bs.modal', function (event) {
    ...Some Code...
    if (someReasonToHideModal) {
        closeModal = true;
        return;
    }
    ...Other Code...

Sau đó, điều này: (Lưu ý tên 'shows.bs.modal' chỉ ra rằng phương thức đã hiển thị hoàn toàn trái ngược với 'chương trình' kích hoạt khi sự kiện chương trình được gọi. (Ban đầu tôi chỉ thử 'hiển thị' nhưng nó không hoạt động. )

$('#myModal').on('shown.bs.modal', function (event) {
    if (closeEditModal) {
        $('#myModal').modal('hide');
        closeModal = false;
    }
});

Hy vọng điều này sẽ giúp ai đó nghiên cứu thêm một ngày nào đó. Tôi đã dành một chút để tìm kiếm một giải pháp trước khi tôi đưa ra điều này.


2

Tôi đã sử dụng mã này -

Ẩn modal với hiệu ứng mượt mà bằng cách sử dụng Fade Out.

$('#myModal').fadeOut();

$('.modal-backdrop').fadeOut();

$('.modal-open').css({'overflow': 'visible'});

1

Nếu bạn đang sử dụng lớp đóng trong các phương thức của mình, phần sau sẽ hoạt động. Tùy thuộc vào trường hợp sử dụng của bạn, tôi thường khuyên bạn chỉ lọc theo phương thức hiển thị nếu có nhiều hơn một phương thức với lớp đóng.

$('.close:visible').click();

0

document.getEuityById ('closeButton'). click (); // thêm thuộc tính data-notify = "modal" vào một phần tử trong phương thức và cung cấp cho nó id này


-1

Đây là thực tế xấu nhưng bạn có thể sử dụng kỹ thuật này để đóng chế độ bằng cách gọi nút đóng trong javascript. Điều này sẽ đóng modal sau 3 giây.

<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<script>
window.onload=function()
{
setInterval(function(){ 

$("#closemodal").click();
}, 3000);

}
</script> 
</head>
<body>

   <div class="container">
 <h2>Modal Example</h2>
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal"   data-target="#myModal">Open Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">

    <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">&times;</button>
      <h4 class="modal-title">Modal Header</h4>
    </div>
    <div class="modal-body">
      <p>Some text in the modal.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal" id="closemodal">Close</button>
    </div>
  </div>

</div>
</div>

 </div>

</body>
</html>

-2

điều này có thể được thực hiện chỉ trong HTML:

data-dismiss="modal"

<button type="button" class="btn btn-secondary" data-dismiss="modal">Save</button>

@KevinFrancis Bởi vì câu hỏi đang tìm kiếm một cách lập trình để làm điều này từ bộ điều khiển, chứ không phải làm thế nào để tạo một nút thực hiện nó.
GreenAsJade
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.