Jak ukryć menu rozwijane Twitter Bootstrap

93

To staje się irytujące - kiedy klikam element w menu rozwijanym Bootstrap, menu nie zamyka się. Mam skonfigurowane otwieranie lightboxa Facebox po kliknięciu elementu rozwijanego, ale jest z nim problem.

wprowadź opis obrazu tutaj


Czego próbowałem

Po kliknięciu elementu próbowałem zrobić to:

    $('.dropdown.open').removeClass('open');
    $('.dropdown-menu').hide();

To go ukrywa, ale z jakiegoś powodu nie otwiera się ponownie.

Jak widać, naprawdę potrzebuję, aby lista rozwijana była zamknięta, ponieważ wygląda kiepsko, gdy pozostaje otwarta (głównie dlatego, z-indexże lista rozwijana jest wyższa niż nakładka pola modalnego Facebox).


Dlaczego nie używam wbudowanego modułu modalnego Bootstrap

Jeśli zastanawiasz się, dlaczego nie używam ładnie wyglądającego modalu wbudowanego w Bootstrap , to dlatego, że:

  1. Nie ma sposobu, aby załadować do niego zawartość za pomocą AJAX.
  2. Musisz wpisać HTML za każdym razem dla modalu; z Faceboxem możesz zrobić proste:$.facebox({ajax:'/assets/ajax/dialogs/dialog?type=block-user&id=1234567'});
  3. Używa animacji CSS3 do animacji (co wygląda bardzo ładnie), ale w przeglądarkach innych niż CSS3 po prostu pokazuje, co nie wygląda tak ładnie; Facebox używa JavaScript do pojawiania się, więc działa we wszystkich przeglądarkach.
Nathan
źródło

Odpowiedzi:

176

Spróbuj tego:

$('.dropdown.open .dropdown-toggle').dropdown('toggle');

Może to również działać dla Ciebie:

$('[data-toggle="dropdown"]').parent().removeClass('open');
Bart Węgrzyn
źródło
Zaktualizowałem kod. Spróbuj ponownie. Wypróbowałem to na otwartych listach rozwijanych i dobrze je zamknęło. Mógłbym je później ponownie otworzyć.
Bart Węgrzyn
3
Dodałem inną metodę, która może działać dla Ciebie. Jeśli tak się nie stanie, sprawdź dokładnie, czy element div.btn-group, w którym znajduje się przycisk, ma przypisaną klasę „open”.
Bart Węgrzyn
9
.dropdown('toggle')zamyka menu, ale także uniemożliwia jego ponowne otwarcie! Nie wiem, jaki jest pożytek z tego!
orad
2
kiedy używam .dropdown („toggle”), inne moduły obsługi kliknięć dołączone do elementów w menu przestają działać. Nie mam jednak tego problemu, gdy używam metody .parent (). RemoveClass ('open').
Ben,
7
Uwaga: usunięcie openklasy działa, ale się nie aktualizuje aria-expanded. Zawsze lepiej używać API, gdy jest to możliwe.
claviska
26

Wypróbowałem większość opcji tutaj, ale żadna z nich nie działała dla mnie. ( $('.dropdown.open').removeClass('open');ukryły to, ale jeśli najechałeś kursorem myszy przed kliknięciem czegokolwiek innego, pojawiło się ponownie.

więc w końcu robię to z $("body").trigger("click")

VeXii
źródło
To też dobry sposób! Więc kiedy wirtualnie klikniesz na <body>, to zamknie listę rozwijaną?
Nathan,
4
tak, lista zawiera zdarzenia kliknięć użytkownika poza menu. :)
VeXii
1
@VeXii tak, i to jest powód, dla którego nie zamyka się na urządzeniach mobilnych. Mam nadzieję, że nowa wersja bootstrap 3 („najpierw mobilna”) to naprawi.
Mister Smith,
1
Działa bez wady.
Dovy
11
$('.open').removeClass('open');

Bootstrap 4 (październik 2018):

$('.show').removeClass('show');
kuiro5
źródło
Myślę, że to naprawdę najprostsze rozwiązanie, z wyjątkiem tego, że w Bootstrap 4 używasz klasy „show”.
Dagmar
6

Musisz tylko $('.dropdown.open').removeClass('open');usunąć drugą linię, która ukrywa menu rozwijane.

Gurinder
źródło
2
Ale to nie zmieni atrybutu arii.
koleś
5

Można to zrobić bez pisania kodu JavaScript, dodając atrybut data-toggle = "dropdown" do tagu kotwicy, jak pokazano poniżej:

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
    Dropdown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#" data-toggle="dropdown">Action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#" data-toggle="dropdown">Another action</a></li>
  </ul>
</div>

Shivaji Mutkule
źródło
Najprostsza i najbardziej odpowiednia dla mnie odpowiedź. Dobrze wyjaśnione. Dzięki
Simmoniz
5

Oto, co zadziałało dla mnie:

$(this).closest(".dropdown").find(".dropdown-toggle").dropdown("toggle");
Dan Puza
źródło
4

Wybrana odpowiedź nie działała dla mnie, ale myślę, że to z powodu nowszej wersji Bootstrap. Skończyło się na napisaniu tego:

$('.btn-navbar').addClass('collapsed');
$('.nav-collapse').removeClass('in').css('height', '0');

Mam nadzieję, że w przyszłości przyda się to komuś innemu.

scolja
źródło
Dziękuję za odpowiedź. Uważam, że nadal korzystam z Bootstrap 2.2.
Nathan
4

Spróbuj tego!

.removeClass("open").trigger("hide.bs.dropdown").trigger("hidden.bs.dropdown");

LUB

$(clicked_element).trigger("click");

To zawsze działa na mnie.

bbc_danang
źródło
U króla! najlepsza rzecz dla mnie! Tnx!
Dudi
3

Po co używać mojej metody, ponieważ jeśli użytkownik wyjdzie z div, ta metoda pozwala użytkownikowi z pewnym opóźnieniem, zanim znikną podmenu. To tak, jakbyś używał wtyczki superfish.

1) Pierwsze pobranie javascript intent hover

Link tutaj: Hover intent javascript

2) Oto mój kod do wykonania

$(document).ready(function(){

        var config = {    
            over: showBootrapSubmenu,   
            timeout: 500,
            out: hideBootrapSubmenu  
        };

        function showBootrapSubmenu(){  
             $(this).addClass('open');
        }
        function hideBootrapSubmenu(){  
          $(this).removeClass('open');
            }

        //Hover intent for Submenus
        $(".dropdown").hoverIntent(config);

    });
Sylvain
źródło
2
$('.dropdown.open').removeClass('open');
Jared Christensen
źródło
1

Spróbuj otworzyć HTML za pomocą Bootstrap Modal, używam tego kodu:

$(function() {
     $('a[data-toggle=modal]').click(function(e) {
          e.preventDefault();
          var page = $(e.target).attr('href');
          var url = page.replace('#','');
          $(page).on('show', function () {
              $.ajax({
              url: "/path_to/"+url+".php/html/...",
              cache: false,
              success: function(obj){
                   $(page).css('z-index', '1999');
                   $(page).html(obj);
              }
              });
         })
     });
}); 

a link wygląda tak:

<a href="#my_page" data-toggle="modal">PAGE</a>
Alex Ball
źródło
1

Oto moje rozwiązanie, jak zamknąć menu rozwijane przycisku i przełączyć przycisk:

$(".btn-group.open", this)
    .trigger("click")
    .children("a.dropdown-toggle")
    .trigger("blur")

Gdzie „this” to globalny kontener grupy przycisków.

Igor Aloise Lod
źródło
1

Bootstrap 4.1:

$(".dropdown-link").closest(".dropdown-menu").removeClass('show');
kennykee
źródło
0

to działało dla mnie, miałem pasek nawigacyjny i kilka menu rozwijanych.

$(document).ready(function () {
    $('a.dropdown-toggle').each(function(){
        $(this).on("click", function () {
            $('li.dropdown').each(function () {
                $(this).removeClass('open');
            });
        });
    });
});
detay
źródło
0

Najłatwiej to zrobić: dodaj ukrytą etykietę:

<label class="hide_dropdown" display='hide'></label>

wtedy za każdym razem, gdy chcesz ukryć listę rozwijaną, dzwonisz:

$(".hide_dropdown").trigger('click');
zhouwubai
źródło
0

Nie wiem, czy to komuś pomoże (może jest to zbyt specyficzne dla mojego przypadku, a nie dla tego pytania), ale dla mnie to zadziałało:

$('.input-group.open').removeClass('open');
Arek
źródło
0

Po kliknięciu:

// Hide mobile menu
$('.in,.open').removeClass('in open');
// Hide dropdown
$('.dropdown-menu').css('display','none');
setTimeout(function(){
    $('.dropdown-menu').css('display','');
},100);
Brynner Ferreira
źródło
0

Użyj class = "dropdown-toggle" na tagu kotwicy, a po kliknięciu tagu kotwicy zamknie on rozwijane menu bootstrap.

Zeeshan Jan
źródło
0

Hej, ta prosta sztuczka z jQuery powinna pomóc.

$(".dropdown li a").click(function(){
$(".dropdown").removeClass("open");
});
Salil Chhetri
źródło
0

Najłatwiejszy sposób:

  $('.navbar-collapse a').click(function(){
    $('.navbar-toggle').trigger('click')
  })
wolfrevo
źródło
0

możesz użyć tego kodu w swojej bieżącej obsłudze zdarzeń

$('.in,.open').removeClass('in open');

w moim scenariuszu użyłem po zakończeniu połączenia Ajax

jQuery(document).on('click', ".woocommerce-mini-cart__buttons .wc-forward.checkout", function() {
    var _this = jQuery(this);
    ajax_call(_this.attr("data-ajax-href"), "checkout-detail");
    $('.in,.open').removeClass('in open');
    return false;
});
Qaisar irfan
źródło
0

Wybór według atrybutu jest powolny. Oto najszybsze rozwiązanie umożliwiające ukrycie otwartego menu:

$(".dropdown-menu.show").parent().dropdown("toggle");

lub użyj poniższego, jeśli .dropdown-menu nie jest kolejnym elementem podrzędnym (znajdź najbliższą rozwijaną kontrolkę nadrzędną):

$(".dropdown-menu.show").closest(".dropdown").dropdown("toggle");
Aleksey Kuznetsov
źródło
0

Mogło zostać dodane z perspektywy czasu (chociaż ta funkcja nie jest udokumentowana , nawet w Bootstrap 4.3.1), ale możesz ją po prostu wywołać z hideparametrem. Po prostu upewnij się, że wywołujesz to w elemencie toggler. Tak jak to:

$('.dropdown-toggle').dropdown('hide');
// or
$('[data-toggle="dropdown"]').dropdown('hide');

Oczywiście działa to również w odwrotnej kolejności z show.

WoodrowShigeru
źródło