diff --git a/js/popover.js b/js/popover.js index 87b8d12de6..c69be715fd 100644 --- a/js/popover.js +++ b/js/popover.js @@ -86,12 +86,18 @@ function Plugin(option) { return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + var selector = options && options.selector if (!data && option == 'destroy') return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (selector) { + if (!data) $this.data('bs.popover', (data = {})) + if (!data[selector]) data[selector] = new Popover(this, options) + } else { + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + } if (typeof option == 'string') data[option]() }) } diff --git a/js/tests/unit/popover.js b/js/tests/unit/popover.js index 827ebb5a52..466ebace26 100644 --- a/js/tests/unit/popover.js +++ b/js/tests/unit/popover.js @@ -173,4 +173,48 @@ $(function () { ok(!$._data($popover[0], 'events').mouseover && !$._data($popover[0], 'events').mouseout, 'popover does not have any events') }) + test('should render popover element using delegated selector', function () { + var $div = $('
') + .appendTo('#qunit-fixture') + .bootstrapPopover({ + selector: 'a', + trigger: 'click' + }) + + $div.find('a').click() + notEqual($('.popover').length, 0, 'popover was inserted') + + $div.find('a').click() + equal($('.popover').length, 0, 'popover was removed') + }) + + test('should render popover elements using different delegated selectors on the same node', function () { + var popoverHTML = '' + + var $div = $(popoverHTML) + .appendTo('#qunit-fixture') + .bootstrapPopover({ + selector: 'a.first', + trigger: 'click' + }) + .bootstrapPopover({ + selector: 'a.second', + trigger: 'click' + }) + + $div.find('a.first').click() + notEqual($('.popover').length, 0, 'first popover was inserted') + + $div.find('a.first').click() + equal($('.popover').length, 0, 'first popover removed') + + $div.find('a.second').click() + notEqual($('.popover').length, 0, 'second popover was inserted') + + $div.find('a.second').click() + equal($('.popover').length, 0, 'second popover removed') + }) }) diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js index d05be3d554..351dd61cb5 100644 --- a/js/tests/unit/tooltip.js +++ b/js/tests/unit/tooltip.js @@ -235,6 +235,37 @@ $(function () { equal($('.tooltip').length, 0, 'tooltip was removed from dom') }) + test('should show tooltips with different delegate selectors on the same node on click', function () { + var tooltipHTML = '' + + var $div = $(tooltipHTML) + .append() + .appendTo('#qunit-fixture') + .bootstrapTooltip({ + selector: 'a.first[rel="tooltip"]', + trigger: 'click' + }) + .bootstrapTooltip({ + selector: 'a.second[rel="tooltip"]', + trigger: 'click' + }) + + $div.find('a.first').click() + ok($('.tooltip').is('.fade.in'), 'first tooltip is faded in') + + $div.find('a.first').click() + equal($('.tooltip').length, 0, 'first tooltip was removed from dom') + + $div.find('a.second').click() + ok($('.tooltip').is('.fade.in'), 'second tooltip is faded in') + + $div.find('a.second').click() + equal($('.tooltip').length, 0, 'second tooltip was removed from dom') + }) + test('should show tooltip when toggle is called', function () { $('') .appendTo('#qunit-fixture') diff --git a/js/tooltip.js b/js/tooltip.js index 944586a2d0..08d22971fd 100644 --- a/js/tooltip.js +++ b/js/tooltip.js @@ -442,12 +442,18 @@ function Plugin(option) { return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + var selector = options && options.selector if (!data && option == 'destroy') return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (selector) { + if (!data) $this.data('bs.tooltip', (data = {})) + if (!data[selector]) data[selector] = new Tooltip(this, options) + } else { + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + } if (typeof option == 'string') data[option]() }) }