J'utilise actuellement des popovers avec Twitter Bootstrap, initiés comme ceci:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Comme vous pouvez le voir, ils sont déclenchés manuellement et cliquer sur .popup-marker (qui est un div avec une image d'arrière-plan) fait basculer un popover. Cela fonctionne très bien, mais j'aimerais également pouvoir fermer le popover en un clic n'importe où ailleurs sur la page (mais pas sur le popover lui-même!).
J'ai essayé plusieurs choses différentes, y compris les suivantes, mais sans résultats à montrer:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
Comment puis-je fermer le popover avec un clic n'importe où ailleurs sur la page, mais pas avec un clic sur le popover lui-même?
javascript
jquery
twitter-bootstrap
Travis Northcutt
la source
la source
Réponses:
En supposant qu'un seul popover peut être visible à tout moment, vous pouvez utiliser un ensemble d'indicateurs pour marquer le moment où un popover est visible, puis les masquer.
Si vous définissez l'écouteur d'événements sur le corps du document, il se déclenchera lorsque vous cliquerez sur l'élément marqué avec 'popup-marker'. Alors tu devras appeler
stopPropagation()
l'objet événement. Et appliquez la même astuce en cliquant sur le popover lui-même.Vous trouverez ci-dessous un code JavaScript fonctionnel qui fait cela. Il utilise jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
La seule mise en garde est que vous ne pourrez pas ouvrir 2 popovers en même temps. Mais je pense que ce serait déroutant pour l'utilisateur, de toute façon :-)
la source
C'est encore plus simple:
la source
html
cause dee.stopPropagation();
Au lieu de cela, j'ai utilisé quelque chose comme$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
qui a bien fait le travail aussi (je ne sais pas s'il y a une différence de performance)$(this).popover('toggle');
partie. Ensuite, si vous avez plusieurs objets de «marqueur contextuel», cliquer sur chacun d'eux fermera les autres.J'avais un besoin similaire et j'ai trouvé cette super petite extension du Twitter Bootstrap Popover de Lee Carmichael, appelée BootstrapX - clickover . Il a également quelques exemples d'utilisation ici . Fondamentalement, cela changera le popover en un composant interactif qui se fermera lorsque vous cliquez ailleurs sur la page, ou sur un bouton de fermeture dans le popover. Cela permettra également d'ouvrir plusieurs popovers à la fois et un tas d'autres fonctionnalités intéressantes.
Le plugin peut être trouvé ici .
Exemple d'utilisation
javascript:
la source
La solution acceptée m'a posé quelques problèmes (en cliquant sur l'élément '.popup-marker' du popover ouvert, les popovers ne fonctionnaient pas par la suite). J'ai trouvé cette autre solution qui fonctionne parfaitement pour moi et c'est assez simple (j'utilise Bootstrap 2.3.1):
MISE À JOUR: Ce code fonctionne également avec Bootstrap 3!
la source
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
cette façon, la fenêtre contextuelle ne se fermera pas même si elle contient du contenu HTMLif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
lire «Ignorer au prochain clic» ici http://getbootstrap.com/javascript/#popovers
Vous pouvez utiliser le déclencheur de focus pour rejeter les popovers au prochain clic, mais vous devez utiliser la
<a>
balise, pas la<button>
balise, et vous devez également inclure untabindex
attribut ...Exemple:
la source
tooltip
, même si ce n'est pas clairement mentionné sur la doc.Toutes les réponses existantes sont assez faibles, car elles reposent sur la capture de tous les événements du document, puis sur la recherche de popovers actifs ou sur la modification de l'appel à
.popover()
.Une bien meilleure approche consiste à écouter les
show.bs.popover
événements sur le corps du document, puis à réagir en conséquence. Vous trouverez ci-dessous le code qui fermera les popovers lorsque le document est cliqué ou escpressé, liant uniquement les écouteurs d'événements lorsque les popovers sont affichés:la source
$(event.target).data("bs.popover").inState.click = false;
à la fonction onPopoverHide afin que vous n'ayez pas besoin de cliquer deux fois pour rouvrir après la fermeture.https://github.com/lecar-red/bootstrapx-clickover
C'est une extension du popover bootstrap de Twitter et résoudra le problème très simplement.
la source
Pour une raison quelconque, aucune des autres solutions ici n'a fonctionné pour moi. Cependant, après beaucoup de dépannage, je suis finalement arrivé à cette méthode qui fonctionne parfaitement (pour moi du moins).
Dans mon cas, j'ajoutais un popover à une table et je le positionnais absolument au-dessus / en dessous de celui sur
td
lequel on avait cliqué. La sélection de la table a été gérée par jQuery-UI Selectable, donc je ne suis pas sûr que cela interfère. Cependant, chaque fois que je cliquais dans le popover, mon gestionnaire de clics qui ciblait$('.popover')
ne fonctionnait jamais et la gestion des événements était toujours déléguée au$(html)
gestionnaire de clics. Je suis assez nouveau dans JS alors peut-être que je manque juste quelque chose?Quoi qu'il en soit, j'espère que cela aide quelqu'un!
la source
Je donne à tous mes popovers les ancres de la classe
activate_popover
. Je les active tous en même temps lors du chargement$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
pour faire fonctionner la fonctionnalité Click Away que j'utilise (dans le script coffee):
Ce qui fonctionne parfaitement avec bootstrap 2.3.1
la source
.prev()
dans le premierif
article. J'utilise Bootstrap 3.2.0.2, il y a peut-être une différence? En outre, vous pouvez simplement omettre la deuxièmeif
clause entière si vous souhaitez pouvoir ouvrir plusieurs fenêtres contextuelles en même temps. Cliquez simplement n'importe où qui n'est pas un élément d'activation de popover (classe 'activate-popover' dans cet exemple) pour fermer tous les popovers ouverts. Fonctionne très bien!Même s'il y a beaucoup de solutions ici, j'aimerais également proposer la mienne, je ne sais pas s'il y a une solution là-haut qui résout tout, mais j'en ai essayé 3 et elles ont eu des problèmes, comme cliquer sur le popover, il le fait lui-même se cacher, d'autres que si j'avais un autre bouton popover cliqué sur les deux / plusieurs popovers apparaissaient toujours (comme dans la solution sélectionnée), Cependant, celui-ci a tout corrigé
la source
Je mettrais l'accent sur le pop-over nouvellement créé et le supprimerais en cas de flou. De cette façon, il n'est pas nécessaire de vérifier quel élément du DOM a été cliqué et le pop-over peut être cliqué, et sélectionné aussi: il ne perdra pas son focus et ne disparaîtra pas.
Le code:
la source
Voici la solution qui a très bien fonctionné pour moi, si cela peut aider:
la source
Voici ma solution, pour ce que ça vaut:
la source
J'ai eu un problème pour le faire fonctionner sur bootstrap 2.3.2. Mais je l'ai fait de cette façon:
la source
légèrement modifié la solution @David Wolever:
la source
Cette question a également été posée ici et ma réponse fournit non seulement un moyen de comprendre les méthodes de traversée DOM jQuery, mais également 2 options pour gérer la fermeture des popovers en cliquant à l'extérieur.
Ouvrez plusieurs popovers à la fois ou un popover à la fois.
De plus, ces petits extraits de code peuvent gérer la fermeture des boutons contenant des icônes!
https://stackoverflow.com/a/14857326/1060487
la source
Celui-ci fonctionne comme un charme et je l'utilise.
Il ouvrira le popover lorsque vous cliquez et si vous cliquez à nouveau, il se fermera, même si vous cliquez en dehors du popover, le popover sera fermé.
Cela fonctionne également avec plus d'un popover.
la source
Une autre solution, elle couvrait le problème que j'avais en cliquant sur les descendants du popover:
la source
Je le fais comme ci-dessous
J'espère que cela t'aides!
la source
Si vous essayez d'utiliser le popover bootstrap de Twitter avec pjax, cela a fonctionné pour moi:
la source
@RayOnAir, j'ai le même problème avec les solutions précédentes. Je me rapproche aussi de la solution @RayOnAir. Une chose qui s'est améliorée est de fermer le popover déjà ouvert lorsque vous cliquez sur un autre marqueur de popover. Donc mon code est:
la source
J'ai trouvé que c'était une solution modifiée de la suggestion de pbaron ci-dessus, car sa solution activait le popover ('hide') sur tous les éléments avec la classe 'popup-marker'. Cependant, lorsque vous utilisez popover () pour le contenu html au lieu du contenu de données, comme je le fais ci-dessous, tout clic à l'intérieur de ce popup html active réellement le popover ('hide'), qui ferme rapidement la fenêtre. Cette méthode ci-dessous itère à travers chaque élément de. Toutes les autres divs sont masquées ...
la source
Je suis venu avec ceci:
Mon scénario incluait plus de popovers sur la même page, et les masquer les rendait simplement invisibles et à cause de cela, cliquer sur les éléments derrière le popover n'était pas possible. L'idée est de marquer le lien popover spécifique comme «actif», puis vous pouvez simplement «basculer» le popover actif. Cela fermera complètement le popover.
la source
J'essayais de trouver une solution simple à un problème simple. Les messages ci-dessus sont bons mais tellement compliqués pour un problème simple. Alors j'ai fait une chose simple. Je viens d'ajouter un bouton de fermeture. C'est parfait pour moi.
la source
J'aime ça, simple mais efficace.
la source
Ajoutez une
btn-popover
classe à votre bouton / lien popover qui ouvre le popover. Ce code fermera les popovers en cliquant en dehors de celui-ci.la source
Une solution encore plus simple, il suffit de parcourir tous les popovers et de les masquer sinon
this
.la source
Pour être clair, il suffit de déclencher le popover
la source
Cela devrait fonctionner dans Bootstrap 4:
Explication:
la source
Essayez
data-trigger="focus"
au lieu de"click"
.Cela a résolu le problème pour moi.
la source