// we use append for html objects to maintain js events
this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
- this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
+ let content = this._getContent()
+ if (typeof content === 'function') {
+ content = content.call(this.element)
+ }
+ this.setElementContent($tip.find(Selector.CONTENT), content)
$tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
}
_getContent() {
return this.element.getAttribute('data-content')
- || (typeof this.config.content === 'function' ?
- this.config.content.call(this.element) :
- this.config.content)
+ || this.config.content
}
_cleanTipClass() {
$popover.trigger($.Event('click'))
}, 200)
})
+
+ QUnit.test('popover should call content function only once', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+ var nbCall = 0
+ $('<div id="popover" style="display:none">content</div>').appendTo('#qunit-fixture')
+ var $popover = $('<a href="#">@Johann-S</a>')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ content: function () {
+ nbCall++
+ return $('#popover').clone().show().get(0)
+ }
+ })
+ .on('shown.bs.popover', function () {
+ assert.strictEqual(nbCall, 1)
+ done()
+ })
+
+ $popover.trigger($.Event('click'))
+ })
})