Как скрыть раскрывающийся список Twitter Bootstrap

93

Это начинает раздражать - когда я нажимаю на элемент в раскрывающемся списке Bootstrap, раскрывающийся список не закрывается. Я настроил его для открытия лайтбокса Facebox, когда вы щелкаете раскрывающийся элемент, но с этим есть проблема.

введите описание изображения здесь


Что я пробовал

При нажатии на элемент я пытался сделать это:

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

Это скрывает его, но потом по какой-то причине он больше не открывается.

Как видите, мне действительно нужно закрыть раскрывающийся список, потому что он выглядит ужасно, когда остается открытым (в основном потому, z-indexчто раскрывающийся список находится выше, чем наложение модального окна Facebox.


Почему я не использую встроенное модальное окно Bootstrap

Если вам интересно, почему я не использую красивое модальное окно, встроенное в Bootstrap , это потому, что:

  1. У него нет возможности загружать в него контент с помощью AJAX.
  2. Вам нужно каждый раз вводить HTML для модального окна; с Facebox вы можете сделать простые:$.facebox({ajax:'/assets/ajax/dialogs/dialog?type=block-user&id=1234567'});
  3. Он использует анимацию CSS3 для анимации (что выглядит очень красиво), но в браузерах, отличных от CSS3, она просто отображается, что выглядит не очень хорошо; Facebox использует JavaScript для постепенного появления, поэтому он работает во всех браузерах.
Натан
источник

Ответы:

176

Попробуй это:

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

Это также может сработать для вас:

$('[data-toggle="dropdown"]').parent().removeClass('open');
Барт Вегжин
источник
Я обновил код. Пожалуйста, попробуйте еще раз. Я пробовал это в раскрывающихся раскрывающихся списках, и они нормально закрывались. Я мог бы потом снова открыть их.
Bart Wegrzyn 08
3
Я добавил еще один метод, который может сработать для вас. Если это не так, дважды проверьте, что элемент div.btn-group, который содержит вашу кнопку, имеет назначенный ему класс «open».
Bart Wegrzyn 09
9
.dropdown('toggle')закрывает раскрывающийся список, но также отключает его повторное открытие! Я не знаю, что от этого толку!
orad
2
когда я использую .dropdown ('toggle'), другие обработчики кликов, прикрепленные к элементам в раскрывающемся списке, перестают работать. Однако у меня нет этой проблемы, когда я использую метод .parent (). RemoveClass ('open').
Бен
7
Внимание: удаление openкласса работает, но не обновляется aria-expanded. Всегда лучше использовать API, когда это возможно.
claviska
26

попробовал большинство вариантов отсюда, но ни один из них не помог мне. ( $('.dropdown.open').removeClass('open');значок скрыл это, но если вы навели курсор мыши, прежде чем щелкнуть что-либо еще, он снова появится.

так что я решил сделать это с $("body").trigger("click")

VeXii
источник
Это тоже хороший способ сделать это! Итак, когда вы виртуально нажимаете на <body>, раскрывающееся меню закрывается?
Натан
4
да, в раскрывающемся списке перечислены события щелчка от пользователя за пределами меню. :)
VeXii
1
@VeXii да, и поэтому он не закрывается на мобильных устройствах. Надеюсь, что новая версия начальной загрузки 3 («сначала мобильные») исправит это.
Мистер Смит
1
Работает без сбоев.
Дови
11
$('.open').removeClass('open');

Bootstrap 4 (октябрь 2018 г.):

$('.show').removeClass('show');
куиро5
источник
Я думаю, что это действительно самое простое решение, за исключением того, что в Bootstrap 4 вы используете класс show.
Дагмар
6

Вам нужно только $('.dropdown.open').removeClass('open');удалить вторую строку, которая скрывает раскрывающееся меню.

Гуриндер
источник
2
Но это не изменит атрибут aria.
чувак
5

Это можно сделать без написания кода JavaScript, добавив атрибут data-toggle = "dropdown" в тег привязки, как показано ниже:

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

Шиваджи Муткуле
источник
Самый простой и актуальный для меня ответ. Хорошо объяснено. Спасибо
Simmoniz
5

Вот что сработало для меня:

$(this).closest(".dropdown").find(".dropdown-toggle").dropdown("toggle");
Дэн Пуза
источник
4

Выбранный ответ не сработал для меня, но я думаю, что это из-за более новой версии Bootstrap. В итоге я написал это:

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

Надеюсь, это поможет кому-то еще в будущем.

сколя
источник
Спасибо за ответ. Я считаю, что все еще использую Bootstrap 2.2.
Натан
4

Попробуй это!

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

ИЛИ

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

У меня всегда получается.

bbc_danang
источник
У король! лучшее для меня! Tnx!
Дуди
3

Зачем использовать мой метод, потому что, если пользователь выходит из div, этот метод позволяет пользователю с определенной задержкой перед исчезновением подменю. Это похоже на использование плагина superfish.

1) Сначала загрузите javascript с намерением наведения

Ссылка здесь: Javascript с намерением наведения

2) Вот мой код для выполнения

$(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);

    });
Сильвен
источник
2
$('.dropdown.open').removeClass('open');
Джаред Кристенсен
источник
2

Прочитав документацию и используя JavaScript, это можно сделать с помощью метода переключения:

$('.button-class').on('click',function(e) {
    e.preventDefault();
    $('.dropdown-class').dropdown('toggle');
}

Вы можете прочитать об этом здесь: http://getbootstrap.com/javascript/#dropdowns-methods

Алфчи
источник
1

Попробуйте открыть HTML с помощью Bootstrap Modal, я использую этот код:

$(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 href="#my_page" data-toggle="modal">PAGE</a>
Алекс Болл
источник
1

Вот мое решение о том, как закрыть раскрывающееся меню кнопки и переключить кнопку:

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

Где «это» - глобальный контейнер группы кнопок.

Игорь Алоиза Лод
источник
1

Bootstrap 4.1:

$(".dropdown-link").closest(".dropdown-menu").removeClass('show');
Kennykee
источник
0

это сработало для меня, у меня была панель навигации и несколько выпадающих меню.

$(document).ready(function () {
    $('a.dropdown-toggle').each(function(){
        $(this).on("click", function () {
            $('li.dropdown').each(function () {
                $(this).removeClass('open');
            });
        });
    });
});
Detay
источник
0

Самый простой способ сделать это: добавить метку скрытия:

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

затем каждый раз, когда вы хотите скрыть раскрывающийся список, вы вызываете:

$(".hide_dropdown").trigger('click');
Чжоуубай
источник
0

Не знаю, поможет ли это кому-нибудь (возможно, это слишком специфично для моего случая, а не для этого вопроса), но для меня это сработало:

$('.input-group.open').removeClass('open');
Арек
источник
0

После щелчка:

// Hide mobile menu
$('.in,.open').removeClass('in open');
// Hide dropdown
$('.dropdown-menu').css('display','none');
setTimeout(function(){
    $('.dropdown-menu').css('display','');
},100);
Бриннер Феррейра
источник
0

Используйте class = "dropdown-toggle" в теге привязки, тогда, когда вы щелкнете по тегу привязки, он закроет раскрывающийся список начальной загрузки.

Зишан Ян
источник
0

Эй, этот простой трюк с jQuery должен помочь.

$(".dropdown li a").click(function(){
$(".dropdown").removeClass("open");
});
Салил Чхетри
источник
0

Самый простой способ:

  $('.navbar-collapse a').click(function(){
    $('.navbar-toggle').trigger('click')
  })
Вольфрево
источник
0

вы можете использовать этот код в своем текущем обработчике событий

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

в моем сценарии я использовал после завершения вызова 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;
});
Кайсар Ирфан
источник
0

Выбор по атрибуту - медленный путь. Вот самое быстрое решение, чтобы скрыть раскрывающийся список:

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

или используйте следующее, если .dropdown-menu не является следующим дочерним элементом (найдите ближайший родительский выпадающий элемент управления):

$(".dropdown-menu.show").closest(".dropdown").dropdown("toggle");
Алексей Кузнецов
источник
0

Возможно, он был добавлен ретроспективно (хотя эта функция не задокументирована даже в Bootstrap 4.3.1), но вы можете просто вызвать ее с hideпараметром. Просто не забудьте вызвать его на элементе переключателя. Вот так:

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

Конечно, это работает и наоборот show.

Вудро Шигеру
источник