Como ocultar o menu suspenso do Twitter Bootstrap

92

Isso está ficando irritante - quando eu clico em um item em uma lista suspensa do Bootstrap, a lista suspensa não fecha. Eu configurei para abrir uma caixa de luz do Facebox quando você clica no item suspenso, mas há um problema com ele.

insira a descrição da imagem aqui


O que eu tentei

Quando o item é clicado, tentei fazer o seguinte:

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

Isso o esconde, mas por algum motivo ele não abrirá novamente.

Como você pode ver, eu realmente preciso que a lista suspensa seja fechada, porque parece uma porcaria quando permanece aberta (principalmente porque o z-indexda lista suspensa é mais alto do que a sobreposição da caixa modal Facebox.


Por que não estou usando a caixa modal embutida do Bootstrap

Se você está se perguntando por que não estou usando a bela caixa modal embutida no Bootstrap , é porque:

  1. Ele não tem uma maneira de carregar conteúdo com AJAX.
  2. Você tem que digitar HTML todas as vezes para o modal; com o Facebox, você pode fazer um simples:$.facebox({ajax:'/assets/ajax/dialogs/dialog?type=block-user&id=1234567'});
  3. Ele usa animações CSS3 para animar (o que parece muito bom), mas em navegadores não CSS3 ele apenas mostra, o que não parece muito bom; Facebox usa JavaScript para fade in, de forma que funciona em todos os navegadores.
Nathan
fonte

Respostas:

176

Experimente isto:

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

Isso também pode funcionar para você:

$('[data-toggle="dropdown"]').parent().removeClass('open');
Bart Wegrzyn
fonte
Eu atualizei o código. Tente novamente, por favor. Eu tentei isso em menus suspensos abertos e fechou-os bem. Eu também poderia reabri-los depois.
Bart Wegrzyn
3
Eu adicionei outro método que pode funcionar para você. Caso contrário, verifique se o elemento div.btn-group que contém seu botão possui a classe "abrir" atribuída a ele.
Bart Wegrzyn
9
.dropdown('toggle')fecha o menu suspenso, mas também desativa sua abertura novamente! Não sei para que serve isso!
orad
2
quando eu uso .dropdown ('toggle'), outros gerenciadores de cliques anexados aos itens no menu suspenso param de funcionar. Não tenho esse problema quando uso o método .parent (). RemoveClass ('open'), no entanto.
Ben
7
Atenção: remover a openclasse funciona, mas não atualiza aria-expanded. É sempre melhor usar a API quando possível.
claviska
26

tentei a maioria das opções a partir daqui, mas nenhuma delas funcionou realmente para mim. (O $('.dropdown.open').removeClass('open');ocultava, mas se você mexia antes de clicar em qualquer outra coisa, ele aparecia novamente.

então acabei fazendo isso com um $("body").trigger("click")

VeXii
fonte
Essa é uma boa maneira de fazer isso também! Então, quando você clica virtualmente no <body>, ele fecha o menu suspenso?
Nathan
4
sim, a lista suspensa está listando os eventos de clique do usuário fora do menu. :)
VeXii
1
@VeXii sim, e por isso não se fecha nos dispositivos móveis. Espero que a nova versão 3 do bootstrap ("mobile first") corrija isso.
Senhor Smith
1
Funciona sem falhas.
Dovy
11
$('.open').removeClass('open');

Bootstrap 4 (outubro de 2018):

$('.show').removeClass('show');
Kuiro5
fonte
Eu acho que esta é realmente a solução mais simples, exceto que com o Bootstrap 4 você usa a classe 'show'.
Dagmar,
7

Isso pode ser feito sem escrever o código JavaScript, adicionando o atributo data-toggle = "dropdown" na tag âncora, conforme mostrado abaixo:

<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
fonte
A resposta mais simples e relevante para mim. Bem explicado. Obrigado
Simmoniz
6

Você só precisa $('.dropdown.open').removeClass('open');remover a segunda linha que oculta o menu suspenso.

Gurinder
fonte
2
Mas isso não mudará o atributo ária.
cara
5

Isto é o que funcionou para mim:

$(this).closest(".dropdown").find(".dropdown-toggle").dropdown("toggle");
Dan Puza
fonte
4

A resposta selecionada não funcionou para mim, mas acho que é por causa da versão mais recente do Bootstrap. Acabei escrevendo isso:

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

Espero que isso seja útil para alguém no futuro.

Escolja
fonte
Obrigado pela resposta. Eu acredito que ainda estou no Bootstrap 2.2.
Nathan de
4

Experimente isso!

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

OU

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

Sempre funciona para mim.

bbc_danang
fonte
Você é o rei! a melhor coisa para mim! Tnx!
Dudi
3

Por que usar o meu método, porque se o usuário sair do div, este método permite ao usuário um certo atraso antes que os submenus desapareçam. É como usar o plugin superfish.

1) Primeiro download hover intent javascript

Link aqui: javascript de intenção de passar o mouse

2) Aqui está meu código para executar

$(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
fonte
2
$('.dropdown.open').removeClass('open');
Jared Christensen
fonte
2

A leitura da documentação e o uso de JavaScript podem ser feitos com o método toggle:

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

Você pode ler sobre isso em: http://getbootstrap.com/javascript/#dropdowns-methods

Alfchee
fonte
1

Tente abrir HTML com Bootstrap Modal, eu uso este código:

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

e o link é assim:

<a href="#my_page" data-toggle="modal">PAGE</a>
Alex Ball
fonte
1

Aqui está minha solução sobre como fechar a lista suspensa do botão e alternar o botão:

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

Onde "this" é um contêiner global do grupo de botões.

Igor Aloise Lod
fonte
1

Bootstrap 4.1:

$(".dropdown-link").closest(".dropdown-menu").removeClass('show');
Kennykee
fonte
0

Isso funcionou para mim, eu tinha uma barra de navegação e vários menus suspensos.

$(document).ready(function () {
    $('a.dropdown-toggle').each(function(){
        $(this).on("click", function () {
            $('li.dropdown').each(function () {
                $(this).removeClass('open');
            });
        });
    });
});
deter
fonte
0

A maneira mais fácil de fazer isso é: você adiciona um rótulo de ocultação:

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

então, sempre que quiser ocultar o menu suspenso, você chama:

$(".hide_dropdown").trigger('click');
Zhouwubai
fonte
0

Não sei se isso vai ajudar alguém (talvez seja muito específico para o meu caso, e não para esta questão), mas para mim funcionou:

$('.input-group.open').removeClass('open');
Arek
fonte
0

Depois de clicar:

// Hide mobile menu
$('.in,.open').removeClass('in open');
// Hide dropdown
$('.dropdown-menu').css('display','none');
setTimeout(function(){
    $('.dropdown-menu').css('display','');
},100);
Brynner Ferreira
fonte
0

Use class = "dropdown-toggle" na tag âncora e, ao clicar na tag âncora, o menu suspenso de bootstrap será fechado.

Zeeshan Jan
fonte
0

Ei, este truque simples do jQuery deve ajudar.

$(".dropdown li a").click(function(){
$(".dropdown").removeClass("open");
});
Salil Chhetri
fonte
0

A maneira mais fácil:

  $('.navbar-collapse a').click(function(){
    $('.navbar-toggle').trigger('click')
  })
wolfrevo
fonte
0

você pode usar este código em seu manipulador de eventos atual

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

no meu cenário eu usei quando a chamada ajax completa

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

Selecionar por atributo é a maneira mais lenta. Aqui está a solução mais rápida para ocultar o menu suspenso aberto:

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

ou use o seguinte, se o menu suspenso não for o próximo elemento filho (encontre o controle suspenso pai mais próximo):

$(".dropdown-menu.show").closest(".dropdown").dropdown("toggle");
Aleksey Kuznetsov
fonte
0

Ele pode ter sido adicionado em retrospecto (embora esse recurso não esteja documentado , mesmo no Bootstrap 4.3.1), mas você pode simplesmente chamá-lo com um hideparâmetro. Apenas certifique-se de chamá-lo no elemento toggler. Igual a:

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

Claro, isso também funciona ao contrário com show.

WoodrowShigeru
fonte