HTML внутри Twitter Bootstrap popover

288

Я пытаюсь отобразить HTML внутри загрузочного поповера, но почему-то это не работает. Я нашел некоторые ответы здесь, но это не будет работать для меня. Пожалуйста, дайте мне знать, если я делаю что-то не так.

<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>
Адриан Мохика
источник

Ответы:

351

Вы не можете использовать, <li href="#"потому что он принадлежит <a href="#", поэтому он не работает, измените его, и все это хорошо.

Здесь работает JSFiddle, который показывает вам, как создать загрузочный загрузчик.

Соответствующие части кода ниже:

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

И, кстати, вам всегда нужно хотя бы $("[data-toggle=popover]").popover();включить поповер. Но вместо data-toggle="popover"вас также можно использовать id="my-popover"или class="my-popover". Просто не забудьте включить их, например, $("#my-popover").popover();в таких случаях.

Вот ссылка на полную спецификацию: Bootstrap Popover

Бонус:

Если по каким - либо причинам вам не нравится или не можете прочитать содержимое всплывающего окна из data-toggleи titleтегов. Вы также можете использовать, например, скрытые div и немного больше JavaScript. Вот пример об этом.

Мауно Вяха
источник
1
Удалите HREF href = "#" в элементах тега ANCHOR, чтобы предотвратить прокрутку вверх страницы!
peter_pilgrim
@peter_pilgrim Спасибо, что сказал это. Я обновил свой ответ, чтобы использовать последнюю версию начальной загрузки, и удалил href = "#" из тегов <a> и заставил их вести себя как кнопки. (Это также задокументировано на сайте начальной загрузки). Добавил эту ссылку в конец моего ответа.
Мауно Вяха
Я обнаружил проблему с устройствами iOS. Поповер работает с сенсорным экраном. Вы нашли общую работу вокруг? На самом деле, я думаю, что это также происходит и с попсовым кодом Bootstrap. Любые идеи?
peter_pilgrim
287

Вы можете использовать атрибут 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>
Деннис Мюнкле
источник
Есть ли способ использовать его в gwtbootstrap3, он не работает в этой форме. Я задал вопрос здесь stackoverflow.com/questions/34142815/… , но ответа пока нет.
ivan_bilan
Не знаю, почему приведенный выше ответ помечен как правильный. Возможно, люди сознательно выбирают самый сложный вариант для сохранения своей работы.
Стивен
У меня есть этот всплывающий элемент внизу моей страницы, и он отлично работает, за исключением ... Он перемещает меня обратно к началу страницы. Я установил его в цикле загрузки миниатюр. Любые идеи?
foxtangocharlie
107

Другой способ указать содержимое поповера повторно используемым способом - создать новый атрибут данных, например, data-popover-contentи использовать его следующим образом:

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

Это может быть полезно, когда у вас много html для размещения в ваших всплывающих окнах.

Вот пример скрипки: http://jsfiddle.net/z824fn6b/

разъем
источник
1
Такой модульный подход довольно элегантен. У вас может быть много всплывающих окон и только одна общая функция JavaScript.
2015 г.
2
Это здорово, @ Джек, спасибо. Мне нравится не добавлять HTML в атрибуты. Так грязно.
Джон Уошам
Потрясающая работа здесь, любовь к простоте и удобству использования
FastTrack
Вы настоящий MVP
плюшевый объект
Кажется, он не работает с начальной загрузкой 3.4.1, не могли бы вы помочь? @Jack stackoverflow.com/questions/60514533/…
user2513846
84

Вам нужно создать экземпляр popover, у которого включена опция html (поместите его в свой файл javascript после кода JS popover):

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

Майк Люсид
источник
22

Я использовал всплывающее окно внутри списка, я привожу пример через 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>'>
user3319310
источник
1
Простейший подход - использовать разные кавычки для переноса HTML-кода. Хорошее мышление.
Джимми Иленлоа
Хорошо, настоящий трюк заключается в замене двойных кавычек на одинарные!
Стивен Барраган
9

Вам нужно только поставить data-html="true"ссылку на поповер. Будет работать.

Тиаго Пиовесан
источник
6

Это небольшая модификация превосходного ответа Джека .

Следующее гарантирует, что простые всплывающие окна, без содержимого HTML, останутся без изменений.

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

Я очень не хочу помещать длинный HTML-код в атрибут, вот мое решение, ясное и простое (замените? Тем, что вы хотите):

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

затем

var help = $('.popover-dismiss');
help.attr('data-content', help.html()).text(' ? ').popover({trigger: 'hover', html: true});
user1079877
источник
4

Это старый вопрос, но это другой способ, используя jQuery для повторного использования поповера и продолжения использования исходных атрибутов данных начальной загрузки, чтобы сделать его более семантическим:

Ссылка

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

Пользовательский контент для отображения

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

Скрипка с полным примером: http://jsfiddle.net/tomsarduy/262w45L5/

Том Сардуй
источник
2

Вы можете изменить «template / popover / popover.html» в файле «ui-bootstrap-tpls-0.11.0.js». Запись: «bind-html-unsafe» вместо «ng-bind»

Он покажет все поповера с HTML. * его небезопасный HTML. Используйте только если вы доверяете HTML.

Гай Бибер
источник
0

Вы можете использовать событие popover и управлять шириной с помощью атрибута «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>

Vĩnh Phú Ngô
источник
-1

Добавьте это в конец вашего файла popper.js:

Popper.Defaults.modifiers.computeStyle.gpuAcceleration = !(window.devicePixelRatio < 1.5 && /Win/.test(navigator.platform));

Источник: https://github.com/twbs/bootstrap/issues/23590

Стеф Ван Луверен
источник