Atualmente, estou usando popovers com o Twitter Bootstrap, iniciado assim:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Como você pode ver, eles são acionados manualmente e clicar em .popup-marker (que é uma div com uma imagem de fundo) alterna uma janela popover. Isso funciona muito bem, mas eu também gostaria de fechar o popover com um clique em qualquer outro lugar da página (mas não no popover em si!).
Eu tentei algumas coisas diferentes, incluindo as seguintes, mas sem resultados para mostrar:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
Como posso fechar o popover com um clique em qualquer outro lugar da página, mas não com um clique no popover em si?
javascript
jquery
twitter-bootstrap
Travis Northcutt
fonte
fonte
Respostas:
Supondo que apenas um popover possa estar visível a qualquer momento, você pode usar um conjunto de sinalizadores para marcar quando há um popover visível e só depois ocultá-los.
Se você definir o ouvinte de evento no corpo do documento, ele será acionado quando você clicar no elemento marcado com 'pop-up-marker'. Então você terá que chamar
stopPropagation()
o objeto de evento. E aplique o mesmo truque ao clicar no popover em si.Abaixo está um código JavaScript funcional que faz isso. Ele usa jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
A única ressalva é que você não poderá abrir dois popovers ao mesmo tempo. Mas acho que seria confuso para o usuário :-)
fonte
Isso é ainda mais fácil:
fonte
html
por causae.stopPropagation();
Em vez disso eu usei algo como$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
o que fez o trabalho muito bem também (não sei se há uma diferença de desempenho embora)$(this).popover('toggle');
parte Então, se você tiver vários objetos 'pop-up de marcadores', clicando em cada um vai fechar os outros..Eu tinha uma necessidade semelhante e encontrei esta grande extensão do Popover Bootstrap do Twitter de Lee Carmichael, chamada BootstrapX - clickover . Ele também tem alguns exemplos de uso aqui . Basicamente, ele mudará a popover para um componente interativo que será fechado quando você clicar em outro lugar na página ou em um botão fechar dentro da popover. Isso também permitirá que vários popovers sejam abertos ao mesmo tempo e vários outros recursos interessantes.
O plug-in pode ser encontrado aqui .
Exemplo de uso
javascript:
fonte
A solução aceita me deu alguns problemas (clicar no elemento '.popup-marker' do popover aberto fazia com que os popovers não funcionassem mais tarde). Eu vim com essa outra solução que funciona perfeitamente para mim e é bastante simples (estou usando o Bootstrap 2.3.1):
ATUALIZAÇÃO: Esse código também funciona com o Bootstrap 3!
fonte
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
dessa forma o pop-up não vai fechar, mesmo que seja tem conteúdo htmlif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
leia "Ignorar no próximo clique" aqui http://getbootstrap.com/javascript/#popovers
Você pode usar o gatilho de foco para descartar popovers no próximo clique, mas precisa usar a
<a>
tag, não a<button>
tag, e também deve incluir umtabindex
atributo ...Exemplo:
fonte
tooltip
, mesmo que não esteja claramente mencionado no documento real.Todas as respostas existentes são bastante fracas, pois dependem da captura de todos os eventos do documento e da localização de popovers ativos ou da modificação da chamada para
.popover()
.Uma abordagem muito melhor é escutar
show.bs.popover
eventos no corpo do documento e reagir de acordo. Abaixo está o código que fechará popovers quando o documento for clicado ou escpressionado, vinculando apenas os ouvintes de eventos quando popovers forem mostrados:fonte
$(event.target).data("bs.popover").inState.click = false;
à função onPopoverHide para que você não precise clicar duas vezes para reabrir após o fechamento.https://github.com/lecar-red/bootstrapx-clickover
É uma extensão do popover de inicialização do twitter e resolverá o problema de maneira muito simples.
fonte
Por alguma razão, nenhuma das outras soluções aqui funcionou para mim. No entanto, após muita solução de problemas, finalmente cheguei a esse método que funciona perfeitamente (pelo menos para mim).
No meu caso, eu estava adicionando um popover a uma tabela e posicionando-o absolutamente acima / abaixo do
td
que foi clicado. A seleção da tabela foi tratada pelo jQuery-UI Selectable, portanto, não tenho certeza se isso estava interferindo. No entanto, sempre que eu clicava dentro do popover, meu manipulador de cliques, que$('.popover')
nunca segmentava, funcionava e a manipulação de eventos sempre era delegada ao$(html)
manipulador de cliques. Eu sou bastante novo para JS, então talvez eu só esteja faltando alguma coisa?Enfim, espero que isso ajude alguém!
fonte
Dou todas as minhas âncoras para a classe
activate_popover
. Ativo todos de uma só vez onload$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
para obter a funcionalidade de clique fora do trabalho que eu uso (no script de café):
O que funciona perfeitamente bem com o bootstrap 2.3.1
fonte
.prev()
primeiraif
cláusula. Estou usando o Bootstrap 3.2.0.2, talvez haja uma diferença? Além disso, você pode simplesmente deixar de fora a segundaif
cláusula inteira se desejar poder abrir vários pop-ups ao mesmo tempo. Basta clicar em qualquer lugar que não seja um elemento de ativação de popover (classe 'ativar-popover' neste exemplo) para fechar todos os popovers abertos. Funciona bem!Embora existam muitas soluções aqui, eu gostaria de propor a minha também, não sei se existe alguma solução lá em cima que resolva tudo, mas tentei 3 delas e elas tiveram problemas, como clicar em na popover auto torna esconder, outros que se eu tivesse outro popover botões clicado ambos / múltiplas popovers ainda parece (como na solução selecionada), Como sempre, este um fixo tudo
fonte
Eu definiria o foco para o pop-over recém-criado e o removeria no desfoque. Dessa forma, não é necessário verificar qual elemento do DOM foi clicado e o pop-over pode ser clicado e também selecionado: ele não perderá o foco e não desaparecerá.
O código:
fonte
Aqui está a solução que funcionou muito bem para mim, se puder ajudar:
fonte
Aqui está a minha solução, para o que vale a pena:
fonte
Eu tive algum problema para fazê-lo funcionar no bootstrap 2.3.2. Mas eu deslizei desta maneira:
fonte
tweaked @David Wolever ligeiramente:
fonte
Essa pergunta também foi feita aqui e minha resposta fornece não apenas uma maneira de entender os métodos de passagem do jQuery DOM, mas duas opções para lidar com o fechamento de popovers clicando fora.
Abra vários popovers de uma só vez ou um popover de cada vez.
Além disso, esses pequenos trechos de código podem lidar com o fechamento de botões que contêm ícones!
https://stackoverflow.com/a/14857326/1060487
fonte
Este funciona como um encanto e eu o uso.
Ele abrirá a janela pop-up quando você clicar e, se você clicar novamente, ela será fechada; também, se você clicar fora dela, a janela popover será fechada.
Isso também funciona com mais de 1 popover.
fonte
Outra solução, abordou o problema que tive ao clicar em descendentes do popover:
fonte
Eu faço isso como abaixo
Espero que isto ajude!
fonte
Se você está tentando usar o popover de inicialização do twitter com pjax, isso funcionou para mim:
fonte
@ RayOnAir, tenho o mesmo problema com as soluções anteriores. Também estou perto da solução @RayOnAir. Uma coisa que melhorou é fechar popover já aberto quando clicar em outro marcador de popover. Então, meu código é:
fonte
Eu achei que essa era uma solução modificada da sugestão do pbaron acima, porque a solução dele ativou o popover ('hide') em todos os elementos com a classe 'popup-marker'. No entanto, quando você usa popover () para conteúdo html em vez do conteúdo de dados, como faço abaixo, qualquer clique dentro desse pop-up html realmente ativa o popover ('hide'), que fecha imediatamente a janela. Este método abaixo itera através de cada elemento .popup-marker e descobre primeiro se o pai está relacionado ao ID do .popup-marker que foi clicado e, nesse caso, não o oculta. Todas as outras divs estão ocultas ...
fonte
Eu vim com isso:
Meu cenário incluía mais popovers na mesma página, e ocultá-los apenas os tornava invisíveis e, por isso, não foi possível clicar nos itens por trás do popover. A idéia é marcar o link popover específico como 'ativo' e, em seguida, você pode simplesmente 'alternar' o popover ativo. Fazer isso fechará a popover completamente.
fonte
Eu estava tentando criar uma solução simples para um problema simples. As postagens acima são boas, mas muito complicadas para um problema simples. Então eu fiz uma coisa simples. Acabei de adicionar um botão Fechar. É perfeito para mim.
fonte
Eu gosto disso, simples, mas eficaz ..
fonte
Adicione
btn-popover
classe ao seu botão / link popover que abre a popover. Este código fechará os popovers ao clicar fora dele.fonte
Uma solução ainda mais fácil, basta percorrer todos os popovers e ocultar, se não
this
.fonte
Para ser claro, basta acionar a popover
fonte
Isso deve funcionar no Bootstrap 4:
Explicação:
fonte
Tente em
data-trigger="focus"
vez de"click"
.Isso resolveu o problema para mim.
fonte