79 votes

Comment insérer un bouton de fermeture dans un popover pour Bootstrap ?

JS :

$(function(){
  $("#example").popover({
    placement: 'bottom',
    html: 'true',
    title : '<span class="text-info"><strong>title</strong></span> <button type="button" id="close" class="close">&times;</button>',
    content : 'test'
  })
  $('html').click(function() {
    $('#close').popover('hide');
  });
});

HTML :

<button type="button" id="example" class="btn btn-primary" ></button>

Je suis en train d'écrire que votre code ne montre pas votre popup.

Quelqu'un a-t-il rencontré ce problème ?

92voto

davidkonrad Points 14038

Vous devez faire le balisage correctement

<button type="button" id="example" class="btn btn-primary">example</button>

Une solution consiste à attacher le gestionnaire de fermeture à l'intérieur de l'élément lui-même, ce qui fonctionne comme suit :

$(document).ready(function() {
    $("#example").popover({
        placement: 'bottom',
        html: 'true',
        title : '<span class="text-info"><strong>title</strong></span>'+
                '<button type="button" id="close" class="close" onclick="$(&quot;#example&quot;).popover(&quot;hide&quot;);">&times;</button>',
        content : 'test'
    });
});

0 votes

Ça marche ! Je me demande pourquoi ce n'est pas intégré dans le noyau de Bootstrap ?

1 votes

@Sebf, bootstrap est destiné à être aussi léger que possible, de nombreux problèmes sont destinés à être résolus dans la couche de mise en œuvre. Oui, certaines parties "manquantes" sont déconcertantes ;-)

0 votes

Il convient de noter que cette solution n'utilise pas la fonction native data-dismiss qui est déjà incluse dans le code de bootstrap. Il crée un nouveau code pour résoudre un problème qui est déjà résolu. J'utilise le code natif dans ma réponse ci-dessous.

33voto

Chris Points 353

Je devais trouver quelque chose qui fonctionne pour plusieurs popovers et dans Bootstrap 3.

Voilà ce que j'ai fait :

J'avais plusieurs éléments pour lesquels je voulais faire fonctionner un popover, donc je ne voulais pas utiliser d'identifiants.

La majoration pourrait être :

<button class="btn btn-link foo" type="button">Show Popover 1</button>
<button class="btn btn-link foo" type="button">Show Popover 2</button>
<button class="btn btn-link foo" type="button">Show Popover 3</button>

Le contenu des boutons d'enregistrement et de fermeture à l'intérieur du popover :

var contentHtml = [
    '<div>',
        '<button class="btn btn-link cancel">Cancel</button>',
        '<button class="btn btn-primary save">Save</button>',
    '</div>'].join('\n');

et le javascript pour les 3 boutons :

Cette méthode fonctionne lorsque le conteneur est le conteneur par défaut non attaché au corps.

$('.foo').popover({
    title: 'Bar',
    html: true,
    content: contentHtml,
    trigger: 'manual'
}).on('shown.bs.popover', function () {
    var $popup = $(this);
    $(this).next('.popover').find('button.cancel').click(function (e) {
        $popup.popover('hide');
    });
    $(this).next('.popover').find('button.save').click(function (e) {
        $popup.popover('hide');
    });
});

Lorsque le conteneur est attaché au "corps".

Ensuite, utilisez l'aria-describedby pour trouver la fenêtre contextuelle et la masquer.

$('.foo').popover({
    title: 'Bar',
    html: true,
    content: contentHtml,
    container: 'body',
    trigger: 'manual'
}).on('shown.bs.popover', function (eventShown) {
    var $popup = $('#' + $(eventShown.target).attr('aria-describedby'));
    $popup.find('button.cancel').click(function (e) {
        $popup.popover('hide');
    });
    $popup.find('button.save').click(function (e) {
        $popup.popover('hide');
    });
});

0 votes

Petite amélioration : popup.find('button.cancel').on('click',function(e) {...}

7 votes

Lorsque je clique sur le lien d'annulation, le popover se ferme. Mais je dois cliquer deux fois sur le lien déclencheur de popover car il n'ouvre pas le popover au premier clic.

0 votes

Il y a une classe prédéfinie .close avec effet de survol, de sorte que l'insertion d'un bouton de fermeture dans le titre ou le contenu est aussi simple que <span class=close>&times;</span> .

15voto

chunguiw Points 121

enter image description here

Voici ce que j'ai utilisé dans mon projet et j'espère que cela pourra vous aider.

<a id="manualinputlabel" href="#" data-toggle="popover" title="weclome to use the sql quer" data-html=true  data-original-title="weclome to use the sql query" data-content="content">example</a>

$('#manualinputlabel').click(function(e) {
              $('.popover-title').append('<button id="popovercloseid" type="button" class="close">&times;</button>');
              $(this).popover();

          });

      $(document).click(function(e) {
         if(e.target.id=="popovercloseid" )
         {
              $('#manualinputlabel').popover('hide');                
         }

      });

0 votes

Hey, merci pour votre réponse ! Savez-vous comment centrer verticalement le &times; dans le cadre du h3.popover-title objet ?

0 votes

Ça a bien marché, mais j'ai eu le même problème avec l'alignement vertical. J'ai ajouté ma propre classe au bouton de fermeture avec line-height: 0.7 !important; et avait l'air bien

0 votes

Lorsque je clique sur le lien d'annulation, le popover se ferme. Mais je dois cliquer deux fois sur le lien déclencheur de popover car il n'ouvre pas le popover au premier clic.

5voto

Bogdanio Points 31

L'astuce consiste à récupérer le Popover actuel avec .data('bs.popover').tip() :

$('#my_trigger').popover().on('shown.bs.popover', function() {
    // Define elements
    var current_trigger=$(this);
    var current_popover=current_trigger.data('bs.popover').tip();

    // Activate close button
    current_popover.find('button.close').click(function() {
        current_trigger.popover('hide');
    });
});

4voto

erik1337 Points 1

Cela fonctionne avec plusieurs popovers et j'ai également ajouté un peu de JS supplémentaire pour gérer les problèmes de z-index qui se produisent avec les popovers qui se chevauchent :

http://jsfiddle.net/erik1337/fvE22/

JavaScript :

var $elements = $('.my-popover');
$elements.each(function () {
    var $element = $(this);

    $element.popover({
        html: true,
        placement: 'top',
        container: $('body'), // This is just so the btn-group doesn't get messed up... also makes sorting the z-index issue easier
        content: $('#content').html()
    });

    $element.on('shown.bs.popover', function (e) {
        var popover = $element.data('bs.popover');
        if (typeof popover !== "undefined") {
            var $tip = popover.tip();
            zindex = $tip.css('z-index');

            $tip.find('.close').bind('click', function () {
                popover.hide();
            });

            $tip.mouseover(function (e) {
                $tip.css('z-index', function () {
                    return zindex + 1;
                });
            })
                .mouseout(function () {
                $tip.css('z-index', function () {
                    return zindex;
                });
            });
        }
    });
});

HTML :

<div class="container-fluid">
    <div class="well popover-demo col-md-12">
        <div class="page-header">
             <h3 class="page-title">Bootstrap 3.1.1 Popovers with a close button</h3>

        </div>
        <div class="btn-group">
            <button type="button" data-title="Popover One" class="btn btn-primary my-popover">Click me!</button>
            <button type="button" data-title="Popover Two" class="btn btn-primary my-popover">Click me!</button>
            <button type="button" data-title="Popover Three (and the last one gets a really long title!)" class="btn btn-primary my-popover">Click me!</button>
        </div>
    </div>
</div>
<div id="content" class="hidden">
    <button type="button" class="close">&times;</button>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>

CSS :

/* Make the well behave for the demo */
 .popover-demo {
    margin-top: 5em
}
/* Popover styles */
 .popover .close {
    position:absolute;
    top: 8px;
    right: 10px;
}
.popover-title {
    padding-right: 30px;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X