HTML dentro de popover Bootstrap de Twitter

288

Estoy tratando de mostrar HTML dentro de un popover bootstrap, pero de alguna manera no funciona. Encontré algunas respuestas aquí, pero no me funcionará. Avísame si estoy haciendo algo 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>
Adrian Mojica
fuente
1
Respondí en la misma pregunta aquí: Código para
Olga

Respuestas:

351

No se puede usar <li href="#"ya que pertenece a <a href="#"eso, por eso no estaba funcionando, cámbielo y está todo bien.

Aquí está trabajando JSFiddle que le muestra cómo crear popover bootstrap.

Las partes relevantes del código están a continuación:

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();
});

Y, por cierto, siempre necesitas al menos $("[data-toggle=popover]").popover();habilitar el popover. Pero en lugar de data-toggle="popover"usted también puede usar id="my-popover"o class="my-popover". Solo recuerde habilitarlos usando, por ejemplo:$("#my-popover").popover(); en esos casos.

Aquí está el enlace a la especificación completa: Bootstrap Popover

Prima:

Si por alguna razón no le gusta o no puede leer el contenido de una ventana emergente de las etiquetas data-toggley title. También puede usar, por ejemplo, divs ocultos y un poco más de JavaScript. Aquí hay un ejemplo sobre eso.

Mauno Vähä
fuente
1
¡Elimine HREF href = "#" en los elementos de la etiqueta ANCHOR para evitar desplazarse a la parte superior de la página!
peter_pilgrim
@peter_pilgrim Gracias por decir eso. Actualicé mi respuesta para usar la última versión de bootstrap y arreglé href = "#" de las etiquetas <a> e hice que se comportaran como botones. (Esto también está documentado en el sitio de arranque). Agregué ese enlace al final de mi respuesta.
Mauno Vähä
Encontré un problema con los dispositivos iOS. El popover funciona con pantalla táctil. ¿Has encontrado una solución general? En realidad, creo que esto también le sucede al código de popover Bootstrap. ¿Algunas ideas?
peter_pilgrim
286

puedes usar el atributo 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>
Dennis Münkle
fuente
¿Hay alguna manera de usarlo en gwtbootstrap3? No funciona de esta forma. He hecho la pregunta aquí stackoverflow.com/questions/34142815/… , pero hasta ahora no hay respuesta.
ivan_bilan
No sé por qué la respuesta anterior está marcada como correcta. Tal vez las personas eligen deliberadamente la opción más complicada para preservar sus trabajos.
stephen
Tengo este popover en la parte inferior de mi página y funciona muy bien, excepto ... Me lleva de vuelta a la parte superior de la página. Lo tengo en un bucle foreach de miniaturas de bootstrap. ¿Algunas ideas?
foxtangocharlie
107

Otra forma de especificar el contenido de popover de forma reutilizable es crear un nuevo atributo de datos como data-popover-contenty usarlo así:

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();
        }
    });
});

Esto puede ser útil cuando tiene mucho html para colocar en sus popovers.

Aquí hay un ejemplo de violín: http://jsfiddle.net/z824fn6b/

Jack
fuente
1
Este enfoque modular es bastante elegante. Puede tener muchos popovers y solo una función genérica de JavaScript.
xtian
2
Esto es genial, @Jack, gracias. Me encanta no tener que poner HTML en los atributos. Muy desordenado.
John Washam
Impresionante trabajo aquí, me encanta la simplicidad y facilidad de uso
FastTrack
Eres el MVP real
plushyObject
No parece estar funcionando con bootstrap 3.4.1, ¿pueden ayudarme? @Jack stackoverflow.com/questions/60514533/…
user2513846
84

Debe crear una instancia de popover que tenga habilitada la opción html (colóquela en su archivo javascript después del código JS de popover):

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

Mike Lucid
fuente
22

Usé un pop dentro de una lista, estoy dando un ejemplo a través de 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>'>
usuario3319310
fuente
1
enfoque más simple mediante el uso de diferentes comillas para envolver el código html. Bien pensado.
Jimmy Ilenloa
¡Agradable, el truco real es cambiar las comillas dobles a comillas simples!
Steven Barragán
8

Solo necesita poner data-html="true"en el enlace popover. Va a funcionar

Tiago Piovesan
fuente
6

Esta es una ligera modificación en la excelente respuesta de Jack .

Lo siguiente asegura que los popovers simples, sin contenido HTML, no se vean afectados.

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();
        }
    });
});
Marc A
fuente
4

Realmente odio poner HTML largo dentro del atributo, aquí está mi solución, clara y simple (¿reemplazar? Con lo que quieras):

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

luego

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

Esta es una vieja pregunta, pero esta es otra forma, usando jQuery para reutilizar el popover y seguir usando los atributos de datos de arranque originales para hacerlo más semántico:

El enlace

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

Contenido personalizado para mostrar

<!-- 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;
    }
});

Violín con un ejemplo completo: http://jsfiddle.net/tomsarduy/262w45L5/

Tom Sarduy
fuente
2

Puede cambiar la 'plantilla / popover / popover.html' en el archivo 'ui-bootstrap-tpls-0.11.0.js' Escriba: "bind-html-unsafe" en lugar de "ng-bind"

Mostrará todos los popover con html. * No es seguro HTML. Úselo solo si confía en el html.

Guy Biber
fuente
0

Puede usar el evento popover y controlar el ancho por el atributo 'ancho de datos'

$('[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>

Vĩnh Phú Ngô
fuente