Podemos fazer com que os popovers sejam descartados da mesma maneira que os modais, ie. fechá-los quando o usuário clica em algum lugar fora deles?
Infelizmente, não posso simplesmente usar modal real em vez de popover, porque modal significa position: fixed e isso não seria mais popover. :(
twitter-bootstrap
popover
Ante Vrli
fonte
fonte
data-trigger="hover"
edata-trigger="focus"
são uma alternativa integrada para fechar a janela popover, se você não quiser usar a alternância. Na minha opinião,data-trigger="hover"
fornece a melhor experiência do usuário ... não há necessidade de escrever código js extra de ...Respostas:
Atualização: Uma solução um pouco mais robusta: http://jsfiddle.net/mattdlockyer/C5GBU/72/
Para botões que contêm apenas texto:
Para botões que contenham uso de ícones (este código possui um bug no Bootstrap 3.3.6, consulte a correção abaixo nesta resposta)
Para popovers gerados por JS Use
'[data-original-title]'
no lugar de'[data-toggle="popover"]'
Advertência: A solução acima permite que vários popovers sejam abertos ao mesmo tempo.
Um popover de cada vez, por favor:
Atualização: Bootstrap 3.0.x, consulte o código ou violão http://jsfiddle.net/mattdlockyer/C5GBU/2/
Isso lida com o fechamento de popovers já abertos e sem cliques ou seus links não foram clicados.
Atualização: Bootstrap 3.3.6, veja violino
Corrige o problema em que, após o fechamento, leva 2 cliques para reabrir
Atualização: Usando o condicionamento da melhoria anterior, esta solução foi alcançada. Corrija o problema de clique duplo e popover fantasma:
fonte
$(document)
invés de,$('body')
pois às vezes obody
não se estende por toda a página.'[data-toggle="popover"]'
, que não funciona com popovers gerados por JavaScript, usei'[data-original-title]'
como seletor.Isso fecha todos os popovers se você clicar em qualquer lugar, exceto em um popover
UPDATE para Bootstrap 4.1
fonte
A versão mais simples e mais segura contra falhas funciona com qualquer versão de inicialização.
Demonstração: http://jsfiddle.net/guya/24mmM/
Demo 2: Não dispensar ao clicar dentro do conteúdo popover http://jsfiddle.net/guya/fjZja/
Demo 3: popovers múltiplos: http://jsfiddle.net/guya/6YCjW/
Simplesmente chamar esta linha descartará todos os popovers:
Ignore todos os popovers ao clicar fora com este código:
O snippet acima anexa um evento de clique no corpo. Quando o usuário clicar em um popover, ele se comportará normalmente. Quando o usuário clicar em algo que não é popover, ele fechará todos os popovers.
Também funcionará com popovers iniciados com Javascript, em oposição a outros exemplos que não funcionarão. (veja a demonstração)
Se você não quiser dispensar ao clicar dentro do conteúdo popover, use este código (consulte o link para a 2ª demonstração):
fonte
!$(e.target).closest('.popover.in').length
seja mais eficiente que!$(e.target).parents().is('.popover.in')
.Com o bootstrap 2.3.2, você pode definir o gatilho para 'foco' e ele simplesmente funciona:
fonte
Basicamente, isso não é muito complexo, mas há algumas verificações a serem feitas para evitar falhas.
Demo (jsfiddle)
fonte
popover()
clique ao invés de passar o mouse?stopPropagation()
o evento passado para o manipulador de cliques (caso contrário, o manipulador oculto oculta imediatamente o popover). Demo (jsfiddle)Nenhuma das supostas soluções votadas funcionou corretamente para mim. Cada um deles leva a um erro quando, após abrir e fechar (clicando em outros elementos), o popover pela primeira vez, ele não abre novamente, até você clicar duas vezes no link de acionamento em vez de um.
Então eu modifiquei um pouco:
fonte
Eu criei um jsfiddle para mostrar como fazer:
http://jsfiddle.net/3yHTH/
A idéia é mostrar a popover quando você clica no botão e ocultar a popover quando você clica fora do botão.
HTML
JS
fonte
jsfiddle bootstrap
e me deu o esqueleto do bootstrap css + js no jsfiddle.basta adicionar este atributo com o elemento
fonte
Isso já foi solicitado aqui . A mesma resposta que eu dei então ainda se aplica:
Eu tinha uma necessidade semelhante e encontrei essa 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.
fonte
É tarde para a festa ... mas pensei em compartilhar. Eu amo o popover, mas ele tem tão pouca funcionalidade embutida. Eu escrevi uma extensão de inicialização .bubble () que é tudo que eu gostaria que fosse o popover. Quatro maneiras de descartar. Clique fora, alterne no link, clique no X e pressione escape.
Ele é posicionado automaticamente para nunca sair da página.
https://github.com/Itumac/bootstrap-bubble
Esta não é uma promoção pessoal gratuita ... Eu peguei o código de outras pessoas tantas vezes na minha vida que queria oferecer meus próprios esforços. Faça um giro e veja se funciona para você.
fonte
De acordo com http://getbootstrap.com/javascript/#popovers ,
Use o gatilho de foco para descartar popovers no próximo clique que o usuário fizer.
fonte
<a>
tag, não a<button>
tag, e também incluir os caracteresrole="button"
etabindex
atributos." Você tentou com essas especificações?Solução aceita modificada. O que eu experimentei foi que, depois que alguns popovers foram ocultados, eles precisavam ser clicados duas vezes para aparecer novamente. Aqui está o que eu fiz para garantir que o popover ('hide') não estivesse sendo chamado em popovers já ocultos.
fonte
Basta adicionar este atributo ao elemento html para fechar o popover no próximo clique.
referência de https://getbootstrap.com/docs/3.3/javascript/#popovers
fonte
Esta solução funciona bem:
fonte
fonte
Você também pode usar o bubbling do evento para remover o pop-up do DOM. Está um pouco sujo, mas funciona bem.
No seu html, adicione a classe .popover-close ao conteúdo dentro do popover que deve fechar o popover.
fonte
Parece que o método 'ocultar' não funciona se você criar o popover com delegação de seletor, em vez disso, 'destruir' deve ser usado.
Eu fiz funcionar assim:
JSfiddle aqui
fonte
Descobrimos que tivemos um problema com a solução em @mattdlockyer (obrigado pela solução!). Ao usar a propriedade seletor para o construtor popover como este ...
... a solução proposta para o BS3 não funcionará. Em vez disso, ele cria uma segunda instância popover local para ela
$(this)
. Aqui está a nossa solução para impedir que:Como mencionado, o
$(this).popover('hide');
criará uma segunda instância devido ao ouvinte delegado. A solução fornecida apenas oculta popovers que já são instanciados.Espero poder poupar a vocês algum tempo.
fonte
O Bootstrap suporta nativamente isso :
JS Bin Demo
fonte
essa solução se livra do irritante segundo clique ao exibir a popover pela segunda vez
testado com o Bootstrap v3.3.7
fonte
Eu tentei muitas das respostas anteriores, realmente nada funciona para mim, mas esta solução funcionou:
https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click
Ex:
fonte
Eu vim com isso: meu cenário incluía mais popovers na mesma página, e escondê-los apenas os tornava invisíveis e, por isso, clicar nos itens atrás do popover não era possível. A idéia é marcar o link popover específico como 'ativo' e, em seguida, você pode simplesmente 'alternar' o popover ativo. Fazer isso fechará o popover completamente $ ('. Popover-link'). Popover ({html: true, container: 'body'})
fonte
Acabei de remover outros pop-ups ativos antes que o novo pop-up seja exibido (auto-inicialização 3):
fonte
testado com 3.3.6 e o segundo clique está ok
fonte
demo: http://jsfiddle.net/nessajtr/yxpM5/1/
}
esta é a minha solução para isso.
fonte
Essa abordagem garante que você possa fechar uma pop-up clicando em qualquer lugar da página. Se você clicar em outra entidade clicável, ela oculta todos os outros popovers. A animação: false é necessária; caso contrário, você receberá um erro .remove no jquery no console.
fonte
Ok, esta é a minha primeira tentativa de realmente responder a algo no stackoverflow, então aqui não vale nada: P
Parece que não está claro que essa funcionalidade realmente funcione imediatamente na última inicialização (bem, se você estiver disposto a comprometer onde o usuário pode clicar. Não tenho certeza se você precisa colocar 'click passe o mouse por si só, mas em um iPad, o clique funciona como uma alternância.
O resultado final é que, em uma área de trabalho, você pode passar o mouse ou clicar (a maioria dos usuários passa o mouse). Em um dispositivo de toque, tocar no elemento o exibirá e, novamente, tocará nele. Obviamente, esse é um pequeno comprometimento em relação aos requisitos originais, mas pelo menos seu código agora está mais limpo :)
fonte
Tomando o código de Matt Lockyer, fiz uma redefinição simples para que o dom não seja coberto pelo elemento no hide.
Código de Matt: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/
Fiddle: http://jsfiddle.net/mrsmith/Wd2qS/
fonte
Tente isso, isso será oculto clicando fora.
fonte
Eu estava tendo problemas com a solução mattdlockyer porque estava configurando links popover dinamicamente usando código como este:
Então eu tive que modificá-lo assim. Corrigiu muitos problemas para mim:
Lembre-se de que o destroy se livra do elemento, portanto a parte do seletor é importante na inicialização dos popovers.
fonte