HTML dans la popover Bootstrap de Twitter


288

J'essaie d'afficher du HTML dans un popover bootstrap, mais d'une manière ou d'une autre, cela ne fonctionne pas. J'ai trouvé quelques réponses ici mais cela ne fonctionnera pas pour moi. Veuillez me faire savoir si je fais quelque chose de mal.

<script>
  $(function(){
    $('[rel=popover]').popover({ 
      html : true, 
      content: function() {
        return $('#popover_content_wrapper').html();
      }
    });
  });
</script>

<li href="#" id="example" rel="popover" data-content="" data-original-title="A Title"> 
    popover
</li>

<div id="popover_content_wrapper" style="display: none">
    <div>This is your div content</div>
</div>

Réponses:


351

Vous ne pouvez pas l'utiliser <li href="#"car il appartient à <a href="#"c'est pourquoi cela ne fonctionnait pas, changez-le et tout va bien.

Voici JSFiddle qui vous montre comment créer un popover bootstrap.

Les parties pertinentes du code sont ci-dessous:

HTML:

<!-- 
Note: Popover content is read from "data-content" and "title" tags.
-->
<a tabindex="0"
   class="btn btn-lg btn-primary" 
   role="button" 
   data-html="true" 
   data-toggle="popover" 
   data-trigger="focus" 
   title="<b>Example popover</b> - title" 
   data-content="<div><b>Example popover</b> - content</div>">Example popover</a>

JavaScript:

$(function(){
    // Enables popover
    $("[data-toggle=popover]").popover();
});

Et au fait, vous devez toujours au moins $("[data-toggle=popover]").popover();activer le popover. Mais à la place de data-toggle="popover"vous, vous pouvez également utiliser id="my-popover"ou class="my-popover". N'oubliez pas de leur permettre d'utiliser par exemple: $("#my-popover").popover();dans ces cas.

Voici le lien vers la spécification complète: Bootstrap Popover

Prime:

Si, pour une raison quelconque, vous n'aimez pas ou ne pouvez pas lire le contenu d'une fenêtre contextuelle à partir des balises data-toggleet title. Vous pouvez également utiliser par exemple des divs cachés et un peu plus de JavaScript. Voici un exemple à ce sujet.


1
Supprimez HREF href = "#" sur les éléments de balise ANCHOR pour éviter de faire défiler vers le haut de la page!
peter_pilgrim

@peter_pilgrim Merci d'avoir dit cela. J'ai mis à jour ma réponse pour utiliser la dernière version de bootstrap et corrigé href = "#" des balises <a> et les ai fait se comporter comme des boutons à la place. (Ceci est également documenté sur le site d'amorçage). Ajout de ce lien à la fin de ma réponse.
Mauno Vähä

J'ai trouvé un problème avec les appareils iOS. Le popover fonctionne avec l'écran tactile. Avez-vous trouvé un travail général autour? En fait, je pense que cela arrive également au code pop-up Bootstrap. Des idées?
peter_pilgrim

286

vous pouvez utiliser l'attribut data-html="true":

<a href="#" id="example"  rel="popover" 
    data-content="<div>This <b>is</b> your div content</div>" 
    data-html="true" data-original-title="A Title">popover</a>

Existe-t-il un moyen de l'utiliser dans gwtbootstrap3, cela ne fonctionne pas sous cette forme. J'ai posé la question ici stackoverflow.com/questions/34142815/… , mais aucune réponse jusqu'à présent.
ivan_bilan

Je ne sais pas pourquoi la réponse ci-dessus est indiquée comme correcte. Peut-être que les gens choisissent délibérément l'option la plus compliquée pour préserver leur emploi.
stephen

J'ai ce popover au bas de ma page et fonctionne très bien sauf ... Il me fait remonter tout en haut de la page. Je l'ai placé dans une boucle foreach de miniatures bootstrap. Des idées?
foxtangocharlie

107

Une autre façon de spécifier le contenu popover d'une manière réutilisable est de créer un nouvel attribut de données comme data-popover-contentet de l'utiliser comme ceci:

HTML:

<!-- Popover #1 -->
<a class="btn btn-primary" data-placement="top" data-popover-content="#a1" data-toggle="popover" data-trigger="focus" href="#" tabindex="0">Popover Example</a>

<!-- Content for Popover #1 -->
<div class="hidden" id="a1">
  <div class="popover-heading">
    This is the heading for #1
  </div>

  <div class="popover-body">
    This is the body for #1
  </div>
</div>

JS:

$(function(){
    $("[data-toggle=popover]").popover({
        html : true,
        content: function() {
          var content = $(this).attr("data-popover-content");
          return $(content).children(".popover-body").html();
        },
        title: function() {
          var title = $(this).attr("data-popover-content");
          return $(title).children(".popover-heading").html();
        }
    });
});

Cela peut être utile lorsque vous avez beaucoup de code HTML à placer dans vos popovers.

Voici un exemple de violon: http://jsfiddle.net/z824fn6b/


1
Cette approche modulaire est assez élégante. Vous pouvez avoir plusieurs popovers et une seule fonction générique javascript.
xtian

2
C'est super, @Jack, merci. J'aime ne pas avoir à mettre du HTML dans des attributs. Tellement désordonné.
John Washam

Travail génial ici, j'adore la simplicité et la convivialité
FastTrack

Vous le vrai MVP
plushyObject

Il ne semble pas fonctionner avec bootstrap 3.4.1, pouvez-vous s'il vous plaît aider? @Jack stackoverflow.com/questions/60514533/…
user2513846

84

Vous devez créer une instance popover dont l'option html est activée (placez-la dans votre fichier javascript après le code JS popover):

$('.popover-with-html').popover({ html : true });


22

J'ai utilisé un pop dans une liste, je donne un exemple via HTML

<a type="button" data-container="body" data-toggle="popover" data-html="true" data-placement="right" data-content='<ul class="nav"><li><a href="#">hola</li><li><a href="#">hola2</li></ul>'>

1
approche la plus simple en utilisant différentes guillemets pour encapsuler le code html. Belle réflexion.
Jimmy Ilenloa

Bien, l'astuce consiste à changer les guillemets doubles en guillemets simples!
Steven Barragán


6

Ceci est une légère modification de l'excellente réponse de Jack .

Ce qui suit garantit que les popovers simples, sans contenu HTML, restent inchangés.

JavaScript:

$(function(){
    $('[data-toggle=popover]:not([data-popover-content])').popover();
    $('[data-toggle=popover][data-popover-content]').popover({
        html : true,
        content: function() {
          var content = $(this).attr("data-popover-content");
          return $(content).children(".popover-body").html();
        },
        title: function() {
          var title = $(this).attr("data-popover-content");
          return $(title).children(".popover-heading").html();
        }
    });
});

4

Je déteste vraiment mettre du long HTML à l'intérieur de l'attribut, voici ma solution, claire et simple (remplacez? Par ce que vous voulez):

<a class="btn-lg popover-dismiss" data-placement="bottom" data-toggle="popover" title="Help">
    <h2>Some title</h2>
    Some text
</a>

puis

var help = $('.popover-dismiss');
help.attr('data-content', help.html()).text(' ? ').popover({trigger: 'hover', html: true});

4

C'est une vieille question, mais c'est une autre façon, en utilisant jQuery pour réutiliser le popover et pour continuer à utiliser les attributs de données d'amorçage d'origine pour le rendre plus sémantique:

Le lien

<a href="#" rel="popover" data-trigger="focus" data-popover-content="#popover">
   Show it!
</a>

Contenu personnalisé à afficher

<!-- Let's show the Bootstrap nav on the popover-->
<div id="list-popover" class="hide">
    <ul class="nav nav-pills nav-stacked">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li><a href="#">Separated link</a></li>
    </ul>
</div>

Javascript

$('[rel="popover"]').popover({
    container: 'body',
    html: true,
    content: function () {
        var clone = $($(this).data('popover-content')).clone(true).removeClass('hide');
        return clone;
    }
});

Violon avec exemple complet: http://jsfiddle.net/tomsarduy/262w45L5/


2

Vous pouvez changer le 'template / popover / popover.html' dans le fichier 'ui-bootstrap-tpls-0.11.0.js' Écrire: "bind-html-unsafe" au lieu de "ng-bind"

Il affichera tous les popover avec html. * son html dangereux. À utiliser uniquement si vous faites confiance au HTML.


0

Vous pouvez utiliser l'événement popover et contrôler la largeur par l'attribut 'data-width'

$('[data-toggle="popover-huongdan"]').popover({ html: true });
$('[data-toggle="popover-huongdan"]').on("shown.bs.popover", function () {
    var width = $(this).attr("data-width") == undefined ? 276 : parseInt($(this).attr("data-width"));
    $("div[id^=popover]").css("max-width", width);
});
 <a class="position-absolute" href="javascript:void(0);" data-toggle="popover-huongdan" data-trigger="hover" data-width="500" title="title-popover" data-content="html-content-code">
 <i class="far fa-question-circle"></i>
 </a>


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.