0
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-02-18 15:54:26 +01:00

Fix tooltip when hovering a children element (delegateTarget) (#30928)

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
This commit is contained in:
Tanguy Krotoff 2020-06-18 09:02:44 +02:00 committed by GitHub
parent ffbdb08474
commit d80a9fc553
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 9 deletions

View File

@ -94,6 +94,7 @@ function getEvent(element) {
function bootstrapHandler(element, fn) { function bootstrapHandler(element, fn) {
return function handler(event) { return function handler(event) {
event.delegateTarget = element
if (handler.oneOff) { if (handler.oneOff) {
EventHandler.off(element, event.type, fn) EventHandler.off(element, event.type, fn)
} }
@ -109,6 +110,7 @@ function bootstrapDelegationHandler(element, selector, fn) {
for (let { target } = event; target && target !== this; target = target.parentNode) { for (let { target } = event; target && target !== this; target = target.parentNode) {
for (let i = domElements.length; i--;) { for (let i = domElements.length; i--;) {
if (domElements[i] === target) { if (domElements[i] === target) {
event.delegateTarget = target
if (handler.oneOff) { if (handler.oneOff) {
EventHandler.off(element, event.type, fn) EventHandler.off(element, event.type, fn)
} }

View File

@ -194,14 +194,14 @@ class Tooltip {
if (event) { if (event) {
const dataKey = this.constructor.DATA_KEY const dataKey = this.constructor.DATA_KEY
let context = Data.getData(event.target, dataKey) let context = Data.getData(event.delegateTarget, dataKey)
if (!context) { if (!context) {
context = new this.constructor( context = new this.constructor(
event.target, event.delegateTarget,
this._getDelegateConfig() this._getDelegateConfig()
) )
Data.setData(event.target, dataKey, context) Data.setData(event.delegateTarget, dataKey, context)
} }
context._activeTrigger.click = !context._activeTrigger.click context._activeTrigger.click = !context._activeTrigger.click
@ -587,14 +587,14 @@ class Tooltip {
_enter(event, context) { _enter(event, context) {
const dataKey = this.constructor.DATA_KEY const dataKey = this.constructor.DATA_KEY
context = context || Data.getData(event.target, dataKey) context = context || Data.getData(event.delegateTarget, dataKey)
if (!context) { if (!context) {
context = new this.constructor( context = new this.constructor(
event.target, event.delegateTarget,
this._getDelegateConfig() this._getDelegateConfig()
) )
Data.setData(event.target, dataKey, context) Data.setData(event.delegateTarget, dataKey, context)
} }
if (event) { if (event) {
@ -627,14 +627,14 @@ class Tooltip {
_leave(event, context) { _leave(event, context) {
const dataKey = this.constructor.DATA_KEY const dataKey = this.constructor.DATA_KEY
context = context || Data.getData(event.target, dataKey) context = context || Data.getData(event.delegateTarget, dataKey)
if (!context) { if (!context) {
context = new this.constructor( context = new this.constructor(
event.target, event.delegateTarget,
this._getDelegateConfig() this._getDelegateConfig()
) )
Data.setData(event.target, dataKey, context) Data.setData(event.delegateTarget, dataKey, context)
} }
if (event) { if (event) {

View File

@ -324,6 +324,28 @@ describe('Tooltip', () => {
tooltip.show() tooltip.show()
}) })
it('should show a tooltip when hovering a children element', done => {
fixtureEl.innerHTML =
'<a href="#" rel="tooltip" title="Another tooltip">' +
'<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 100 100">' +
'<rect width="100%" fill="#563d7c"/>' +
'<circle cx="50" cy="50" r="30" fill="#fff"/>' +
'</svg>' +
'</a>'
const tooltipEl = fixtureEl.querySelector('a')
const tooltip = new Tooltip(tooltipEl)
spyOn(tooltip, 'show')
tooltipEl.querySelector('rect').dispatchEvent(createEvent('mouseover', { bubbles: true }))
setTimeout(() => {
expect(tooltip.show).toHaveBeenCalled()
done()
}, 0)
})
it('should show a tooltip on mobile', done => { it('should show a tooltip on mobile', done => {
fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">' fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">'

View File

@ -81,6 +81,17 @@ And with custom HTML added:
</button> </button>
{{< /highlight >}} {{< /highlight >}}
With an SVG:
<div class="bd-example tooltip-demo">
<a href="#" data-toggle="tooltip" title="Default tooltip">
<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 100 100">
<rect width="100%" height="100%" fill="#563d7c"/>
<circle cx="50" cy="50" r="30" fill="#007bff"/>
</svg>
</a>
</div>
## Usage ## Usage
The tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element. The tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element.