diff --git a/js/src/tooltip.js b/js/src/tooltip.js index 097477f7a1..1ad5615c21 100644 --- a/js/src/tooltip.js +++ b/js/src/tooltip.js @@ -448,6 +448,7 @@ class Tooltip extends BaseComponent { if (trigger === 'click') { EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => { const context = this._initializeOnDelegatedTarget(event) + context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]) context.toggle() }) } else if (trigger !== TRIGGER_MANUAL) { diff --git a/js/tests/unit/popover.spec.js b/js/tests/unit/popover.spec.js index da5821e760..1338821bc8 100644 --- a/js/tests/unit/popover.spec.js +++ b/js/tests/unit/popover.spec.js @@ -1,6 +1,8 @@ import EventHandler from '../../src/dom/event-handler.js' import Popover from '../../src/popover.js' -import { clearFixture, getFixture, jQueryMock } from '../helpers/fixture.js' +import { + clearFixture, getFixture, jQueryMock, createEvent +} from '../helpers/fixture.js' describe('Popover', () => { let fixtureEl @@ -313,6 +315,28 @@ describe('Popover', () => { popover.show() }) }) + + it('should keep popover open when mouse leaves after click trigger', () => { + return new Promise(resolve => { + fixtureEl.innerHTML = 'BS X' + + const popoverEl = fixtureEl.querySelector('a') + new Popover(popoverEl) // eslint-disable-line no-new + + popoverEl.addEventListener('shown.bs.popover', () => { + popoverEl.dispatchEvent(createEvent('mouseout')) + + popoverEl.addEventListener('hide.bs.popover', () => { + throw new Error('Popover should not hide when mouse leaves after click') + }) + + expect(document.querySelector('.popover')).not.toBeNull() + resolve() + }) + + popoverEl.click() + }) + }) }) describe('hide', () => {