Jak ukryć modalność Bootstrap za pomocą javascript?


281

Przeczytałem tutaj posty, stronę Bootstrap i Googled jak szalony - ale nie mogę znaleźć na pewno łatwej odpowiedzi ...

Mam modal Bootstrap, który otwieram z pomocnika link_to w następujący sposób:

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

W mojej ContactsController.createakcji mam kod, który tworzy, Contacta następnie przekazuje do create.js.erb. W create.js.erb, mam trochę kodu obsługi błędów (mieszanka ruby ​​i javascript). Jeśli wszystko pójdzie dobrze, chcę zamknąć modal.

To tutaj mam problemy. Nie mogę odrzucić modalu, kiedy wszystko idzie dobrze.

Próbowałem $('#myModal').modal('hide');i to nie ma wpływu. Próbowałem również, $('#myModal').hide();co powoduje, że modal odrzuca, ale pozostawia tło.

Wszelkie wskazówki, jak zamknąć modal i / lub odrzucić tło od wewnątrz create.js.erb?

Edytować

Oto znacznik dla 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');jest poprawną składnią do zamykania / ukrywania modalu o id myModal(możesz to przetestować na stronie dokumentacji Bootstrap ). Czy na pewno masz element o tym identyfikatorze na swojej stronie? Co również próbujesz osiągnąć dzięki temu połączeniu? Twoja obecna implementacja wykonuje żądanie Ajax new_contact_pathi jednocześnie otwiera modal z zawartością #myModal- czy tego właśnie chcesz?
Julian D.

Cześć, Julian. Powyżej zamieściłem znacznik myModal i rzeczywiście istnieje div z identyfikatorem myModal. Spróbowałem ponownie $('myModal').modal('hide')i nadal nie jestem dobry. HM Pod względem tego, co próbuję osiągnąć, myślę, że użycie pomocnika link_to mogło być niepoprawne. Zastąpiłem to: <a data-toggle="modal" href="#myModal" class="btn btn-primary">Add Contact</a>ponieważ tak naprawdę nie potrzebuję dzwonić do new_contact_path. Chcę tylko, aby modal się otworzył, a następnie zajął się wprowadzaniem przez użytkownika. Dzięki za poświęcenie czasu na odpowiedź. Zobaczę, czy nie mogę tego rozwiązać.
jvillian

Myślę, że to tylko literówka, ale połączenie powinno być $('#myModal').modal('hide');( #brakuje komentarza).
Julian D.

1
Moje złe pisanie zamiast kopiowania z rzeczywistego kodu. Rzeczywisty kod brzmi: $('#myModal').modal('hide'). J
Jvillian

Możesz spróbować użyć bootboxjs
md. ariful ahsan

Odpowiedzi:


493

Gdy modal jest otwarty w oknie przeglądarki, użyj konsoli przeglądarki, aby spróbować

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

Jeśli to działa (a modal zamyka się), to wiesz, że twój zamknięty Javascript nie jest poprawnie wysyłany z serwera do przeglądarki.

Jeśli to nie działa, musisz dokładniej zbadać, co się dzieje. Np. Upewnij się, że nie ma dwóch elementów o tym samym identyfikatorze. Np. Czy działa po raz pierwszy po załadowaniu strony, ale nie po raz drugi?

Konsola przeglądarki: firebug dla Firefoxa, konsola debugująca dla Chrome lub Safari itp.


Drugi akapit był tym, czego szukałem. Zduplikowane identyfikatory sprawiły, że moje moduły nie wyświetlały się poprawnie za drugim razem.
Matias

To rozwiązało problem. Dzięki.
Finchy70

77

aby zamknąć modal bootstrap , możesz przekazać „hide” jako opcję metody modalnej w następujący sposób

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

Proszę spojrzeć na działające skrzypce tutaj

bootstrap zapewnia również zdarzenia, które można podłączyć do funkcjonalności modalnej , np. jeśli chcesz uruchomić zdarzenie, gdy modal jest już ukryty przed użytkownikiem, możesz użyć ukrytego. bs.modal zdarzenia możesz przeczytać więcej o metodach modalnych i zdarzeniach tutaj w Dokumentacja

Jeśli żadna z powyższych metod nie działa, podaj identyfikator przycisku zamknięcia i naciśnij przycisk zamknięcia.


1
Jest to szczególnie przydatne, gdy dokładnie wiesz, w którym momencie modalne okno dialogowe ma zostać zamknięte. Na przykład na końcu funkcji sukcesu. W ten sposób, jeśli wystąpi błąd, okno dialogowe może go wyświetlić.
Czy

47

Używam Bootstrap 3.4 Dla mnie to nie działa

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

W desperacji zrobiłem to:

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

Może nie jest elegancki, ale działa


2
Byłoby lepiej, gdybyś użył $ (". Modal-backdrop"). Remove ();
Bloodhound,

1
wprowadzi to nowe błędy. proszę użyć zalecanych metod,
Benjamin Eckstein

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

mały buggy, ale na pewno działa. Rozwiązanie Manuela Fernando poniżej działało dla mnie idealnie.
Munam Yousuf

@Umingo, proszę polecić metodę, jeśli te wymienione tutaj nie są dobre i znasz ją.
rozpiętość

47

Najlepsza forma do ukrywania i pokazywania modalu za pomocą bootstrapu

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

Jak dotąd najlepsza odpowiedź. Symulowanie zachowania za pomocą kliknięć, jQuery fadeOut lub css może na dłuższą metę powodować niedopasowania.
Giorgio Tempesta

43

Wystąpił ten sam błąd i ten wiersz kodu naprawdę mi pomaga.

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

1
Przeczytałem inny problem, który sugerował, że problemem może być atrybut odrzucania danych w elemencie, a następnie próba wyzwolenia go z javascript
Femtosecond

Many Many Many Thanks Manuel, to po wielu poszukiwaniach rozwiązało mój problem $ ('# MyModelId'). Modal ('hide'); $ („[data-dismiss = modal]”). trigger ({type: „click”}); że chciałem zamknąć modal na sukces w ajax .... naprawdę
wielkie

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

zadziałało, ale zepsuło modalność, jeśli ponownie go otworzę, modal już się nie przewija
Kos

21

Znalazłem prawidłowe rozwiązanie, w którym możesz użyć tego kodu

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

najlepsze jak dotąd rozwiązanie
Kos

znakomity to po prostu najlepszy +1
MooMoo

11

Natknąłem się na coś, co moim zdaniem było podobne. $('#myModal').modal('hide');Prawdopodobnie uruchomiony przez tą funkcją i uderza linię

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

Problem polega na tym, że wartość isShown może być niezdefiniowana, nawet jeśli wyświetlany jest modal, a wartość powinna być prawdziwa. Zmodyfikowałem nieco kod ładowania początkowego do następującego

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

Wydawało się, że to w większości rozwiązało problem. Jeśli tło nadal pozostaje, zawsze możesz dodać połączenie, aby ręcznie usunąć je po połączeniu ukrytym $('.modal-backdrop').remove();. Wcale nie jest idealny, ale działa.


11

(W odniesieniu do Bootstrap 3), w celu ukrycia modalnej użycie: $('#modal').modal('hide'). Ale powodem, dla którego tło pozostało (dla mnie) było to, że niszczę DOM dla modalu, zanim zakończyło się „ukrywanie”.

Aby rozwiązać ten problem, powiązałem ukryte zdarzenie z usunięciem DOM. W moim przypadku: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
ale czy możesz mi powiedzieć o this.render()jego wyświetlaniu undefined is not a functionw mojej chromowanej konsoli.
Anil Kumar Pandey,

9

Miałem więcej szczęścia, wykonując połączenie po wystąpieniu „pokazanego” oddzwaniania:

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

Zapewniło to załadowanie modalu przed wykonaniem wywołania hide ().


8

Odkryliśmy, że między wywołaniem naszego kodu serwera a powrotem do udanego połączenia zwrotnego było tylko niewielkie opóźnienie. Jeśli zapakowaliśmy wywołanie do serwera w $("#myModal").on('hidden.bs.modal', function (e)module obsługi, a następnie wywołaliśmy $("#myModal").modal("hide");metodę, przeglądarka ukryłaby modal, a następnie wywołała kod po stronie serwera.

Znowu nie elegancki, ale funkcjonalny.

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

Jak widać, myFuncwywołanie spowoduje ukrycie modalu, a następnie wywołanie kodu po stronie serwera.


6

Miałem ten sam problem i po kilku eksperymentach znalazłem rozwiązanie. W moim module obsługi kliknięć musiałem zatrzymać wyświetlanie zdarzenia, takie jak:

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

6

Oto dokument: http://getbootstrap.com/javascript/#modals-methods

Oto metoda: $ ('# myModal'). Modal ('hide')

Jeśli chcesz otworzyć kilka razy modal z inną zawartością, proponuję dodać (w tobie główne js):

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

Więc wyczyścisz zawartość do następnego otwarcia i unikniesz pewnego rodzaju buforowania


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

5

Nawet ja mam takie same problemy. To bardzo mi pomogło

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


4

$('#modal').modal('hide');i jego warianty nie działały dla mnie, chyba że miałem data-dismiss="modal"jako atrybut przycisk Anuluj. Tak jak ty, moje potrzeby były możliwe do zamknięcia / ewentualnie zamknięcia w oparciu o jakąś dodatkową logikę, więc kliknięcie linku z data-dismiss="modal"bezpośrednim nie wystarczy. Skończyło się na tym, data-dismiss="modal"że mam ukryty przycisk, z którego mógłbym programowo wywołać moduł obsługi kliknięć, więc

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

a następnie w modułach obsługi kliknięć, aby anulować, gdy musisz zamknąć modal, jaki możesz mieć

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

W moim przypadku (strona z brzytwą asp net) miałem to podobne do OP: miałem nieco pusty div z klasą „modal” i dynamicznie dodałem do niego plik cshtml, np. Ciało modalne i kliknąłem przycisk tego ciało, gdy tylko zostanie pokazany modal. samo wywołanie „.modal („ ukryj) ”nie było wystarczające, jak zauważyłeś:„ data-disciss = "modal” ”na przycisku wywołującym była okazją !!! ty
Csharpest

3

Musimy zadbać o bulgotanie zdarzeń. Musisz dodać jeden wiersz kodu

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

3

Zdaję sobie sprawę, że to stare pytanie, ale stwierdziłem, że żadne z nich nie było dokładnie tym, czego dokładnie szukałem. Wydaje się, że jest to spowodowane próbą zamknięcia modalu przed jego zakończeniem.

Moje rozwiązanie opierało się na odpowiedzi @ schoonie23, ale musiałem zmienić kilka rzeczy.

Najpierw zadeklarowałem zmienną globalną na początku mojego skryptu:

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

Następnie w moim kodzie modalnym:

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

Następnie: (Zwróć uwagę na nazwę „pokazano.bs.modal” wskazującą, że modal pokazał się całkowicie w przeciwieństwie do „show”, który uruchamia się po wywołaniu zdarzenia show. (Początkowo próbowałem po prostu „pokazano”, ale to nie zadziałało. )

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

Mam nadzieję, że to kiedyś uratuje komuś dodatkowe badania. Zanim to wymyśliłem, trochę szukałem rozwiązania.


2

Użyłem tego kodu -

Ukryj modal z płynnym efektem za pomocą Fade Out.

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

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

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

1

Jeśli używasz klasy zamkniętej w swoich modach, następujące będą działać. W zależności od przypadku użycia, ogólnie polecam filtrowanie tylko do widocznego modalu, jeśli istnieje więcej niż jeden modal z klasą zamkniętą.

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

0

document.getElementById ('closeButton'). click (); // dodaj atrybut data-dismiss = "modal" do elementu w module i nadaj mu ten identyfikator


-1

Jest to zła praktyka, ale możesz użyć tej techniki do zamknięcia modalu, wywołując przycisk zamykania w javascript. Spowoduje to zamknięcie modalu po 3 sekundach.

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

można to zrobić tylko w HTML:

data-dismiss="modal"

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

@KevinFrancis Ponieważ pytanie szuka programowego sposobu, aby to zrobić ze sterownika, a nie jak zrobić przycisk, który to robi.
GreenAsJade
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.