我无法使用ajax重新加载引导程序popover的内容。 以下是一些代码:http://pastie.org/3960102
第二个ajax请求(当我点击“a.close”时)返回一个更新的内容(我可以在控制台中看到它),但它没有加载到popover中。
我四处寻找解决方案,但似乎都没有。
我还能尝试什么? 谢谢
答案 0 :(得分:7)
您可以直接访问popover工具提示内容,而无需重置data-content
属性。
替换以下行:
t.attr('data-content', r);
使用此代码:
t.data('popover').tip().html(r);
2012年更新
正如Pigueiras在他的评论中指出的那样,这会破坏popover的默认模板。更好的解决方案是替换.popover-content
:
t.data('popover').tip().find('.popover-content').empty().append(r);
2016年更新
感谢另一条评论,这是Bootstrap 3的工作代码:
t.data('bs.popover').tip().find('.popover-content').empty().append(r);
答案 1 :(得分:5)
为什么empty()
然后append()
可以替换?
t.data('popover').tip().find('.popover-content').html(r);
编辑:
此外,第一种方法是正确的,并且当popover已经初始化并且您想要动态更改内容时,它可以正常工作(bootstrap 2.1)。您只需再次调用'show'
以使弹出窗口更新(内容和位置):
t.attr('data-content', r);
t.popover('show');
答案 2 :(得分:3)
下班后'搜索,我想通了。对于Bootstrap 3,您可以使用以下代码。更多参考资料是:
https://github.com/twbs/bootstrap/issues/11528和Bootstrap popover content cannot changed dynamically
if($element.data('bs.popover')) {
$element.data('bs.popover').options.content = 'NEW CONTENT';
}
答案 3 :(得分:1)
同样的问题,我用这个技巧解决它,代码很冗长,只是一个例子,优化它!
// functions container
var doc =
{
doPopover : function( item_id, title, content )
{
// get jq item
var item = $('#' + item_id );
// the trick to "refresh content" in every call
item.attr('data-content', content);
// popover
item.popover(
{
title : title,
trigger : 'manual'
}).popover('show');
},
popoverFirstCall : function()
{
this.doPopover('myDiv', 'Title', 'MyContent1');
},
popoverSecondCall : function()
{
var content = 'xxx'; // get the content in Ajax
this.doPopover('myDiv', 'Title', content);
}
}
// call funcs in your views
$(document).ready(function()
{
// first popover with first content
doc.popoverFirstCall();
// this event wich call the ajax content and refresh popover.
$('#button').on('click', $.proxy(doc, 'popoverSecondCall'));
});
我认为刷新标题的技巧也一样。
如果你有更好的解决方案,请告诉我!
编辑:
我继续调查,
我们可以在插件代码上看到:
getContent: function () {
var content
, $e = this.$element
, o = this.options
content = $e.attr('data-content')
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
return content
}
所以,内容取自attr“data-content”,或者是在popover的第一次调用(instanciation)时给出的选项。
但是,实际上,问题是,选项被缓存而不是每次调用都刷新,所以必须使用:
$('item_id').attr('data-content', 'some content'); // and warning, it is different than
$('item_id').data('content', 'some content');
并且bootstrap得到了attr方式。
标题相同:
getTitle: function () {
var title
, $e = this.$element
, o = this.options
title = $e.attr('data-original-title')
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
return title
}
所以,doPopover函数可以是:
doPopover : function( item_id, title, content )
{
// get jq item
var item = $('#' + item_id );
// the trick to "refresh content" in every call
item.attr('data-content', content); // do not use data() way.
item.attr('data-original-title', title);
// popover (trace first call if you want)
item.popover(
{
trigger : 'manual'
});
item.popover('show);
}
适合我。
答案 4 :(得分:0)
这项工作形成了我: 在文档就绪上初始化popover(数据是带有HTML的json和找到元素的大小)
$.ajax({
url: "/alpha/annuncio/scegliGestione",
success: function (data) {
$('#notifiche').popover(
{
title:"Le tue notifiche",
placement:'bottom',
trigger:'manual'
});
$('#notifiche').find(".badge").text(data.size);
}
});
在弹出窗口的触发事件中,您必须按顺序切换弹出窗口(显示或隐藏),使popover-content为空,最后附加data.html
$("#notifiche").click(function(){
$.get("/alpha/annuncio/scegliGestione", function(data) {
$('#notifiche').popover('toggle')
$("body").find('.popover-content').empty()
$("body").find('.popover-content').append(data.html);
$('#notifiche').find(".badge").text(data.size);
});
/* */
});