Eu tenho um menu suspenso Twitter Bootstrap. Como todos os usuários do Twitter Bootstrap sabem, o menu suspenso se fecha ao clicar (mesmo clicando dentro dele).
Para evitar isso, posso anexar facilmente um manipulador de eventos de clique no menu suspenso e simplesmente adicionar o famoso event.stopPropagation()
.
<ul class="nav navbar-nav">
<li class="dropdown mega-dropdown">
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-list-alt"></i> Menu item 1
<span class="fa fa-chevron-down pull-right"></span>
</a>
<ul class="dropdown-menu mega-dropdown-menu">
<li>
<div id="carousel" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators">
<li data-slide-to="0" data-target="#carousel"></li>
<li class="active" data-slide-to="1" data-target="#carousel"></li>
</ol>
<div class="carousel-inner">
<div class="item">
<img alt="" class="img-rounded" src="img1.jpg">
</div>
<div class="item active">
<img alt="" class="img-rounded" src="img2.jpg">
</div>
</div>
<a data-slide="prev" role="button" href="#carousel"
class="left carousel-control">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
<a data-slide="next" role="button" href="#carousel"
class="right carousel-control">
<span class="glyphicon glyphicon-chevron-right"></span>
</a>
</div>
</li>
</ul>
</li>
</ul>
Isso parece fácil e um comportamento muito comum, no entanto, e como carousel-controls
(assim como carousel indicators
) os manipuladores de eventos são delegados ao document
objeto, o click
evento nesses elementos ( controles anteriores / próximos , ...) será "ignorado".
$('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){
// The event won't be propagated up to the document NODE and
// therefore delegated events won't be fired
event.stopPropagation();
});
Contar com o menu suspenso hide
/ hidden
eventos do Bootstrap do Twitter não é uma solução pelos seguintes motivos:
- O objeto de evento fornecido para os dois manipuladores de eventos não fornece referência ao elemento clicado
- Como não tenho controle sobre o conteúdo do menu suspenso,
flag
não é possível adicionar uma classe ou atributo
Este violino é o comportamento normal e esse violino é event.stopPropagation()
adicionado.
Atualizar
Agradeço a Roman por sua resposta . Eu também encontrei uma resposta que você pode encontrar abaixo .
event propagation
item foi parado.Respostas:
Remover o atributo de dados
data-toggle="dropdown"
e implementar a abertura / fechamento da lista suspensa pode ser uma solução.Primeiro, manipule o clique no link para abrir / fechar o menu suspenso assim:
e depois ouvir os cliques fora do menu suspenso para fechá-lo assim:
Aqui está a demonstração: http://jsfiddle.net/RomaLefrancois/hh81rhcm/2/
fonte
// PREVENT INSIDE CLICK DROPDOWN
$('.dropdown-menu').on("click.bs.dropdown", function (e) { e.stopPropagation(); e.preventDefault(); });
e.stopPropagation()
é a melhor solução.Isso deve ajudar também
fonte
'.dropdown-menu :not(.dropdown-item)'
para que clicar em umdropdown-item
fecha o pop-up, mas clicar em umdropdown-header
não.O Bootstrap fornece a seguinte função:
Portanto, a implementação dessa função deve poder desativar o fechamento da lista suspensa.
fonte
target
propriedade do evento é ali.dropdown
,relatedTarget
é aa.dropdown-toggle
. Portanto, você não pode se referir ao elemento clicado nohide
manipulador de eventos.target.hasClass(".keepopen")
deveria sertarget.hasClass("keepopen")
. Caso contrário, o código não funcionará.A melhor resposta absoluta é colocar uma tag de formulário após o menu suspenso da classe
então seu código é
fonte
<li>
elemento não deve estar dentro de um<form>
elemento.Eu também encontrei uma solução.
Supondo que os
Twitter Bootstrap Components
manipuladores de eventos relacionados sejam delegados aodocument
objeto, faço um loop nos manipuladores anexados e verifico se o elemento clicado atual (ou um de seus pais) está relacionado a um evento delegado.Espero que ajude quem procura uma solução semelhante.
Obrigado a todos por sua ajuda.
fonte
Isso pode ajudar:
fonte
Isso pode funcionar para qualquer condição.
fonte
jQuery:
HTML:
Demo :
Genérico: https://jsfiddle.net/kerryjohnson/omefq68b/1/
Sua demonstração com esta solução: http://jsfiddle.net/kerryjohnson/80oLdtbf/101/
fonte
Eu tentei essa coisa simples e funcionou como um encanto.
Alterei o elemento do menu suspenso de
<div>
para<form>
e funcionou bem.fonte
Eu tenho um problema semelhante recentemente e tentou diferentes maneiras de resolvê-lo com a remoção do atributo de dados
data-toggle="dropdown"
e ouvindoclick
comevent.stopPropagation()
ligando.A segunda maneira parece mais preferível. Os desenvolvedores de Bootstrap também usam dessa maneira. No arquivo de origem, encontrei a inicialização dos elementos suspensos:
Então, esta linha:
sugere que você possa colocar um
form
elemento dentro do contêiner com a classe.dropdown
para evitar fechar o menu suspenso.fonte
O Bootstrap resolveu esse problema eles mesmos no suporte a
<form>
tags em listas suspensas. A solução deles é bastante compreensível e você pode lê-lo aqui: https://github.com/twbs/bootstrap/blob/v4-dev/js/src/dropdown.jsTudo se resume a impedir a propagação no elemento do documento e fazê-lo apenas para eventos do tipo
'click.bs.dropdown.data-api'
que correspondem ao seletor'.dropdown .your-custom-class-for-keep-open-on-click-elements'
.Ou no código
fonte
form
abordagem dos exemplos não está funcionando para você - eu estava usando a classedropleft
, mas também precisadropdown
para que o seletor de formulários corresponda.Modifiquei a resposta do @ Vartan para fazê-lo funcionar com o Bootstrap 4.3. Sua solução não funciona mais com a versão mais recente, pois a
target
propriedade sempre retorna a raiz do menu suspenso,div
não importa onde o clique foi colocado.Aqui está o código:
fonte
$('.dropdown-keep-open').on('hide.bs.dropdown', ev => !(ev.clickEvent && $(ev.target).has(ev.clickEvent.target).length))
return !target.closest('.dropdown-keep-open').length)
. Dito isto, esta é uma ótima solução! Achei isso necessário para resolver esse problema.fonte
Atualizei-o novamente para ser o mais inteligente e funcional possível. agora fecha quando você passa o mouse fora da nav, permanecendo aberto enquanto estiver dentro dela. simplesmente perfeita.
fonte
show
, o menu suspenso não fecha ao clicar fora, e precisamos clicar no menu suspenso antes de ... +1 de qualquer maneirabody
evento clique ^^$('body').on('click', function (e) {
Como por exemplo, o Bootstrap 4 Alpha possui este Menu Event. Por que não usar?
fonte
e.preventDefault();
bloqueia links, você pode ignorá-loVocê pode interromper a propagação da lista suspensa e reimplementar manualmente os controles do carrossel usando métodos javascript do carrossel .
Aqui está o jsfiddle .
fonte
Com o Angular2 Bootstrap, você pode usar nonInput na maioria dos cenários:
https://valor-software.com/ng2-bootstrap/#/dropdowns
fonte
Eu sei que esta pergunta foi especificamente para jQuery, mas para quem usa AngularJS com esse problema, você pode criar uma diretiva que lida com isso:
Em seguida, basta adicionar o atributo
dropdown-prevent-close
ao seu elemento que está acionando o menu para fechar, e isso deve impedi-lo. Para mim, foi umselect
elemento que fechou automaticamente o menu:fonte
<div class="dropdown-menu" ng-click="$event.stopPropagation()">
funciona para mim no 1.2.x[Bootstrap 4 Alpha 6] [Rails] para o Rails desenvolvedor,
e.stopPropagation()
vai levar a um comportamento indesejável paralink_to
comdata-method
não é igual aget
uma vez que, por padrão, devolver todo o seu pedido oget
.Para remediar esse problema, sugiro esta solução, que é universal
Mostrar snippet de código
fonte
Em vez de escrever algum código javascript ou jquery (reinventar a roda). O cenário acima pode ser gerenciado pela opção de fechamento automático de autoinicialização. Você pode fornecer um dos valores para fechar automaticamente :
sempre - (Padrão) fecha automaticamente o menu suspenso quando qualquer um dos seus elementos é clicado.
outsideClick - fecha a lista suspensa automaticamente somente quando o usuário clica em qualquer elemento fora da lista suspensa.
desabilitado - desativa o fechamento automático
Dê uma olhada no seguinte plunkr:
http://plnkr.co/edit/gnU8M2fqlE0GscUQtCWa?p=preview
Conjunto
Espero que isto ajude :)
fonte
ui-bootstrap
, o que provavelmente não é o caso de muitas pessoas que visualizam essa pergunta.uib-dropdown auto-close="outsideClick"
. O menu fechar ao clicar dentro é apenas um pouco desconfortável, mas o menu não fecha ao clicar fora é bastante perturbador.Sei que já existe uma resposta anterior sugerindo o uso de um formulário, mas a marcação fornecida não está correta / ideal. Aqui está a solução mais fácil, não é necessário javascript e isso não interrompe o seu menu suspenso. Funciona com o Bootstrap 4.
<form class="dropdown-item"> <!-- Your elements go here --> </form>
fonte
Isso me ajudou,
Seu elemento do menu suspenso precisa ser assim (observe as classes
dropdown-menu
ekeepopen
.O código acima evita a espera geral
<body>
, em vez do elemento específico da classedropdown-menu
.Espero que isso ajude alguém.
Obrigado.
fonte
A solução de trabalho mais simples para mim é:
keep-open
classe a elementos que não devem causar fechamento suspensofonte
Descobri que nenhuma das soluções funcionou como gostaria de usar a navegação padrão de inicialização. Aqui está minha solução para esse problema:
fonte
No
.dropdown
conteúdo, coloque a.keep-open
classe em qualquer etiqueta da seguinte forma:Os casos anteriores evitavam os eventos relacionados aos objetos de contêiner, agora o contêiner herda a classe keep-open e check antes de ser fechado.
fonte
Eu fiz isso com isso:
fonte
fonte
Para fechar a lista suspensa apenas se um evento de clique foi acionado fora da lista suspensa de inicialização, é isso que funcionou para mim:
Arquivo JS:
Arquivo HTML:
fonte
Você pode ter alguns problemas se usar o método return false ou stopPropagation () porque seus eventos serão interrompidos. Experimente este código, funciona bem:
Em HTML:
Se você deseja fechar o dropdrown:
fonte
No Bootstrap 4, você também pode fazer isso:
onde
#dd-link
é o elemento âncora ou botão que possui adata-toggle="drowndown"
propriedadefonte