2014-12-01 54 views
14

我想以编程方式销毁&重新创建特定的Bootstrap弹出窗口。所以我所做的是:Bootstrap popover只会每隔一秒就销毁并重新创建作品

$('#popoverspan').popover('destroy'); 
$('#popoverspan').popover({placement : 'bottom', trigger : 'hover', content : 'Here it is!'}); 

而且它每隔一秒只工作一次。我认为这是销毁弹出窗口的时间问题,但即使在两条线之间添加延迟也无济于事。我在JSFiddle中重新创建了这个问题:http://jsfiddle.net/Lfp9ssd0/10/

这是为什么?有人建议它可以工作,例如,在Twitter Bootstrap Popover with dynamically generated content via ajaxBootstrap Popover Reinitialization (To refresh Content)

它工作得很好,当我跳过摧毁,但我不知道当我为一个元素创建另一个popover而不摧毁已有的popover时会发生什么。它是否被重新初始化,或者它是否会失去访问旧的popover?

回答

20

自己解决了。显然.popover('destroy')是异步的,并且立即创建另一个弹出窗口失败,而前一个被破坏。我尝试使用alert添加延迟,由于某些原因失败。使用setTimeout()之前创造新的酥料饼是不是最优雅,但工作液:

$('#popoverspan').popover('destroy'); 
setTimeout(function() { 
    $('#popoverspan').popover({ 
     placement : 'bottom', 
     trigger : 'hover', 
     content : 'Here is new popover!' 
    }); 
}, 200); 

200毫秒似乎不够,但它可能需要在其他情况下微调。

+1

Dangit!这让我疯狂。我从来没有想过这是一个异步调用。感谢您的领导! – 2016-12-14 15:28:25

+0

我也猜想这是一个异步调用..现在你验证这个猜测。非常困难,需要至少2个小时的我:( – flipperweid 2017-05-17 06:12:46

+0

感谢您拯救我!我花了几个小时在这! – 2017-10-23 16:35:03

5

我遇到了与此处所述相同的问题。经过广泛的搜索之后,我找到了一种方法来更改popover的内容,而不必先摧毁它。只需在未指定内容选项的情况下初始化弹出窗口。

$('#popoverspan').popover({ 
    placement : 'bottom', 
    trigger : 'hover', 
}); 

请注意,上面的弹出式初始化并未指定内容。 popover无法显示,它没有内容。现在指定导致弹出窗口中显示不同类型文本的条件。

if (condition_1) { 
    $("#popoverspan").data('bs.popover').options.content = "Something important here!" 
} 
else { 
    $("#popoverspan").data('bs.popover').options.content = "This is also important!" 
} 

现在我们准备展示popover。

$("#popoverspan").popover('show'); 

这对Bootstrap 3.0有效。当然,当你准备好时,当页面上发生适当的事件时,你可以像平常一样销毁或隐藏弹出窗口。

更新: 如果你只需要改变酥料饼之后的文字酥料饼是显示已经,你基本上可以使用相同的技术。 1)获取附加弹出窗口的DOM,然后更改内容并再次显示弹出窗口。下面的例子:

$("#popoverspan").data('bs.popover').options.content = "some new text"; 
$("#popoverspan").popover('show'); 
0

@Deniz答案是伟大的,但如果你想酥料饼的显示后更改标题/内容,你是老年引导版本(我的是3.3.1),你应该使用$('.your_popover_target').data('popover').options.content = "new text"而不是.data('bs.popover'),接着是$('.your_popover_target').popover('show');

0

我试过setTimeout的方法,由于某种原因它没有工作,然后我深入研究了popover对象,实际上有一个destroy()方法工作得很好。例如。:

var popover = $.data($('#popoverspan'), "bs.popover"); 
popover.destroy();