Created
July 14, 2015 04:04
-
-
Save dkemper01/0e8e386ae1bbb658a404 to your computer and use it in GitHub Desktop.
The Bootstrap Async Popover Extension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
+function ($) { | |
'use strict' | |
// EXTENDED POPOVER PUBLIC CLASS DEFINITION | |
// =============================== | |
var PopoverAsync = function (element, options) { | |
this.init('popoverasync', element, options) | |
} | |
if (!$.fn.tooltip) throw new Error('PopoverAsync requires tooltip.js') | |
PopoverAsync.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { | |
placement: 'right', | |
trigger: 'click', | |
content: '', | |
template: '<div class="popover"><h3 class="popover-title"></h3><div class="popover-content"></div><div class="arrow"></div></div>' | |
}) | |
// NOTE: THIS CUSTOM POPOVER EXTENDS tooltip.js | |
// ================================ | |
PopoverAsync.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) | |
PopoverAsync.prototype.constructor = PopoverAsync | |
PopoverAsync.prototype.getDefaults = function () { | |
return PopoverAsync.DEFAULTS | |
} | |
PopoverAsync.prototype.setContent = function () { | |
var $tip = this.tip() | |
var title = this.getTitle() | |
var content = this.getContent(function (thatRef, fetchedContent) { | |
$tip.find('.popover-content')[ // we use append for html objects to maintain js events | |
thatRef.options.html ? (typeof fetchedContent == 'string' ? 'html' : 'append') : 'text' | |
](fetchedContent) | |
}); | |
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) | |
$tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) | |
$tip.removeClass('fade top bottom left right in') | |
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do | |
// this manually by checking the contents. | |
if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() | |
} | |
PopoverAsync.prototype.hasContent = function () { | |
return this.getTitle() || this.getContent() | |
} | |
PopoverAsync.prototype.getContent = function (callback) { | |
var $e = this.$element | |
var o = this.options | |
var contentToReturn = '' | |
if ($e.attr('data-content')) { | |
contentToReturn = $e.attr('data-content') | |
} | |
else if (typeof o.content == 'function') { | |
o.content.call($e[0], callback, this) | |
contentToReturn = '<div style="width: 5em; margin-left: auto; margin-right: auto; text-align: center;"><img width="24" height="24" src="data:image/gif;base64,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" /></div>' | |
} else { | |
contentToReturn = o.content | |
} | |
return contentToReturn | |
} | |
PopoverAsync.prototype.arrow = function () { | |
return this.$arrow = this.$arrow || this.tip().find('.arrow') | |
} | |
PopoverAsync.prototype.tip = function () { | |
if (!this.$tip) this.$tip = $(this.options.template) | |
return this.$tip | |
} | |
// EXTENDED POPOVER PLUGIN DEFINITION | |
// ========================= | |
var old = $.fn.popoverasync | |
$.fn.popoverasync = function (option) { | |
return this.each(function () { | |
var $this = $(this) | |
var data = $this.data('bs.popoverasync') | |
var options = typeof option == 'object' && option | |
if (!data && option == 'destroy') return | |
if (!data) $this.data('bs.popoverasync', (data = new PopoverAsync(this, options))) | |
if (typeof option == 'string') data[option]() | |
}) | |
} | |
$.fn.popoverasync.Constructor = PopoverAsync | |
// POPOVER NO CONFLICT | |
// =================== | |
$.fn.popoverasync.noConflict = function () { | |
$.fn.popoverasync = old | |
return this | |
} | |
}(jQuery) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment