Bootstrap popover内容无法动态更改

Ara*_*han 59 jquery popover twitter-bootstrap

我使用如下代码:

$(".reply").popover({
  content: "Loading...",
  placement: "bottom"
});

$(".reply").popover("toggle");
Run Code Online (Sandbox Code Playgroud)

这正确地创建了popover及其内容.我想在不关闭弹出窗口的情况下将新数据加载到弹出框中.

我尝试过以下方法:

var thisVal = $(this);
$.ajax({
  type: "POST",
  async: false,
  url: "Getdes",
  data: { id: ID }
}).success(function(data) {
  thisVal.attr("data-content", data);
});
Run Code Online (Sandbox Code Playgroud)

在此调用之后,元素中的数据将被更改,但不会显示在显示的弹出框中.

我该怎么办?

Dav*_*ing 81

如果你像这样抓住popover实例:

var popover = $('.reply').data('bs.popover');
Run Code Online (Sandbox Code Playgroud)

然后,要重绘popover,请使用以下.setContent()方法:

popover.setContent();
Run Code Online (Sandbox Code Playgroud)

我发现浏览源代码:https://github.com/twitter/bootstrap/blob/master/js/popover.js

所以,在你的例子中,尝试:

thisVal.attr('data-content',data).data('bs.popover').setContent();
Run Code Online (Sandbox Code Playgroud)

更新

setContent()方法还会删除放置级别,因此您应该:

var popover = thisVal.attr('data-content',data).data('bs.popover');
popover.setContent();
popover.$tip.addClass(popover.options.placement);
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/44RvK

  • .data('bs.popover')而不是最新版本中的.data('popover') (6认同)
  • 最近popover的数据标签已更改,因此您需要使用.data('bs-popover')而不是.data('popover') (5认同)
  • 如果你需要重新定位偏移量`calculated_offset = popover.getCalculatedOffset(popover.options.placement,popover.getPosition(),popover.$ tip [0] .offsetWidth,popover.$ tip [0] .offsetHeight); popover.applyPlacement(calculated_offset,popover.options.placement);`有点乱...... (2认同)

Yan*_*bot 73

是的,你可以,事实上还没有提出最简单的方法.

这是我的方式 - >

    var popover = $('#example').data('bs.popover');
    popover.options.content = "YOUR NEW TEXT";
Run Code Online (Sandbox Code Playgroud)

popover是一个对象,如果你想了解它的更多信息,请在定义后尝试执行console.log(popover)以查看如何在以后使用它!

编辑

从Bootstrap 4 alpha 5开始,数据结构有点不同.你需要使用popover.config.content而不是popover.options.content

感谢@kfriend的评论

  • .data('bs.popover')而不是最新版本中的.data('popover') (9认同)
  • 从Bootstrap 4 alpha 5开始,数据结构有点不同.你需要使用`popover.config.content`而不是`popover.options.content`. (3认同)
  • 它工作正常,只需将内容设置为Yann指定,然后调用popover.show().这是最好的答案"短,没有副作用,像其他一些答案一样反击" (2认同)
  • 我把它用于`popover.options.placement ='bottom'`,谢谢Yann! (2认同)
  • 在BS3为我工作; 快点容易.我认为这是最好的答案. (2认同)

nei*_*ker 22

在bootstrap 3中:

if($el.data('bs.popover')) {
    $el.data('bs.popover').options.content = "New text";
}
$el.popover('show');
Run Code Online (Sandbox Code Playgroud)


Mar*_*k L 14

2012年的答案不适用于Bootstrap 3 popovers.我从提取工作解决了这个问题:

$("#popover").attr('data-content','new content');


bjm*_*m88 10

大多数这些解决方案对我来说实际上看起来很糟糕.Bootstrap标准文档有一个destroy可以使用的方法.因此,通过某些事件更改内容,您可以简单地销毁然后重新创建内容.

.popover('destroy')
Run Code Online (Sandbox Code Playgroud)

这适当地动态加载,刷新和重新呈现弹出窗口的内容.