306

我试图在引导弹出窗口中显示 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>
4

13 回答 13

368

你不能使用<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"or代替class="my-popover"。只要记住使用 eg:$("#my-popover").popover();在这些情况下启用它们。

这是完整规范的链接: Bootstrap Popover

奖金:

如果由于某种原因您不喜欢或无法从data-contentandtitle标签中读取弹出窗口的内容。您还可以使用隐藏的 div 和更多的 JavaScript。这是一个例子

于 2012-11-02T22:27:18.017 回答
298

你可以使用属性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>
于 2013-05-02T10:34:54.970 回答
117

以可重用方式指定弹出内容的另一种方法是创建一个新的数据属性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/

于 2014-10-16T16:00:34.887 回答
87

您需要创建一个启用了 html 选项的弹出框实例(将其放在弹出框 JS 代码之后的 javascript 文件中):

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

于 2012-11-02T21:59:55.223 回答
24

我在列表中使用了弹出窗口,我通过 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>'>
于 2014-02-17T13:26:25.877 回答
11

您只需要放入data-html="true"链接弹出框。会工作的。

于 2019-01-14T16:58:31.710 回答
9

这是一个老问题,但这是另一种方式,使用 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/

于 2015-08-02T06:51:41.570 回答
7

这是对杰克的优秀答案的轻微修改。

以下内容确保没有 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();
        }
    });
});
于 2015-06-19T03:10:49.797 回答
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});
于 2014-06-27T08:10:10.647 回答
3

在最新版本的 bootstrap 4.6 上,您可能还需要sanitize:false用于添加复杂的 html。

$('.popover-with-html').popover({ html : true, sanitize : false })
于 2021-03-12T19:37:21.007 回答
2

您可以更改文件'ui-bootstrap-tpls-0.11.0.js'中的'template/popover/popover.html'写:“bind-html-unsafe”而不是“ng-bind”

它将显示所有带有 html 的弹出框。*它不安全的html。仅在您信任 html 时使用。

于 2014-07-04T07:43:01.983 回答
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>

于 2019-06-19T01:43:15.697 回答
0

实际上,如果您将 Bootstrap5 与 Django 一起使用,那么他们将内容作为字符串传递的方法是完美的,并且符合 Django 的模板包含。您可以使用所需的任何部分 HTML 创建一个模板文件,例如,对于 Bootstrap5 似乎没有 X-editable 似乎可以工作,所以您可能希望将行编辑与 Ok|Cancel 按钮一起作为内容. 无论如何,这就是我的意思:

 <button data-bs-content="{% include './popover_content.html' %}" type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" title="Popover title" >
  Click to toggle popover
 </button>

我的settings.py模板部分如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,     # True is necessary for django-bootstrap5 to work!
        'OPTIONS': {
            'debug': True,
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

我将(每个应用程序的)模板保存在一个<project dir>/templates/<app name>文件夹中。我就在上面的示例代码经过测试的地方MyMainApp/popover_content.html旁边。MyMainApp/home.html但是,如果您将模板保存在每个应用程序的 Django 文件夹中,那么您需要将“MyApp/templates”添加到TEMPLATES[0]{'DIRS': ['MyApp/templates', 'MyApp2/templates']}列表中。

因此,至少这将使您能够将弹出框 HTML 放入通常的、语法高亮的 Django 模板格式,并充分利用 Django 模板的模块化到组件中。

我个人打算用它来制作一个可编辑的标签(我的应用程序中一些数据的标题和描述字段)。

一个缺点是,如果在包含: "{% include './popover_content.html' %}", then you must use single quotes all throughout the popover_content.html` 模板时使用双引号 (")。

您还需要为弹出框启用 html,因此您的站点范围的弹出框初始化程序将变为:

<script type="text/javascript">
  $(document).ready(() => {
    var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'))
    var popoverList = popoverTriggerList.map(
      function (popoverTriggerEl) {
        return new bootstrap.Popover(popoverTriggerEl, {
          html: true,
        });
      });
  });
</script>

这是(无样式的)结果。总之,使用默认提供的字符串传入方法,并传入一个包含的Django模板文件。问题解决了!

在此处输入图像描述

于 2021-10-04T14:30:39.940 回答