1
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-09-26 05:19:15 +02:00

Accept elements as the tooltip / popover content

When a DOM node is passed to an HTML tooltip, the `title` node is only
moved if it is not already in the tooltip. Otherwise, `empty()` is used
instead of `detach()` before appending the `title` to avoid memory
leaks. If a DOM node is passed to a plain text tooltip, its text is
copied via jQuery `.text()`.

Replaces `.detach()` with `.empty()`, as `.detach()` is almost never
useful but instead leaks memory. The difference between `empty` and
`detach` is that the latter keeps all the attached jQuery events/data.
However, since we do not return the previous children, the user would
have to keep these themselves, thus they can `detach()` if necessary.

This is a port of https://github.com/twbs/bootstrap/pull/14552 to v4.
This commit is contained in:
Gleb Mazovetskiy
2015-08-31 00:57:16 +01:00
parent 8941bdfbda
commit c7d8e7a077
6 changed files with 93 additions and 25 deletions

View File

@@ -43,7 +43,7 @@ const Tooltip = (($) => {
const DefaultType = {
animation : 'boolean',
template : 'string',
title : '(string|function)',
title : '(string|element|function)',
trigger : 'string',
delay : '(number|object)',
html : 'boolean',
@@ -356,19 +356,33 @@ const Tooltip = (($) => {
}
setContent() {
let tip = this.getTipElement()
let title = this.getTitle()
let method = this.config.html ? 'html' : 'text'
let $tip = $(this.getTipElement())
$(tip).find(Selector.TOOLTIP_INNER)[method](title)
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
$(tip)
$tip
.removeClass(ClassName.FADE)
.removeClass(ClassName.IN)
this.cleanupTether()
}
setElementContent($element, content) {
let html = this.config.html
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
// content is a DOM node or a jQuery
if (html) {
if (!$(content).parent().is($element)) {
$element.empty().append(content)
}
} else {
$element.text($(content).text())
}
} else {
$element[html ? 'html' : 'text'](content)
}
}
getTitle() {
let title = this.element.getAttribute('data-original-title')