0
0
mirror of https://github.com/twbs/bootstrap.git synced 2024-12-01 13:24:25 +01:00

Add getOrCreateInstance method in base-component (#33276)

Co-authored-by: Rohit Sharma <rohit2sharma95@gmail.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
This commit is contained in:
GeoSot 2021-06-03 18:53:27 +03:00 committed by GitHub
parent 4a5029ea29
commit c98657b830
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 744 additions and 124 deletions

View File

@ -9,7 +9,6 @@ import {
defineJQueryPlugin, defineJQueryPlugin,
getElementFromSelector getElementFromSelector
} from './util/index' } from './util/index'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import BaseComponent from './base-component' import BaseComponent from './base-component'
@ -87,11 +86,7 @@ class Alert extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.get(this, DATA_KEY) const data = Alert.getOrCreateInstance(this)
if (!data) {
data = new Alert(this)
}
if (config === 'close') { if (config === 'close') {
data[config](this) data[config](this)

View File

@ -51,6 +51,10 @@ class BaseComponent {
return Data.get(element, this.DATA_KEY) return Data.get(element, this.DATA_KEY)
} }
static getOrCreateInstance(element, config = {}) {
return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)
}
static get VERSION() { static get VERSION() {
return VERSION return VERSION
} }

View File

@ -6,7 +6,6 @@
*/ */
import { defineJQueryPlugin } from './util/index' import { defineJQueryPlugin } from './util/index'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import BaseComponent from './base-component' import BaseComponent from './base-component'
@ -51,11 +50,7 @@ class Button extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.get(this, DATA_KEY) const data = Button.getOrCreateInstance(this)
if (!data) {
data = new Button(this)
}
if (config === 'toggle') { if (config === 'toggle') {
data[config]() data[config]()
@ -74,11 +69,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {
event.preventDefault() event.preventDefault()
const button = event.target.closest(SELECTOR_DATA_TOGGLE) const button = event.target.closest(SELECTOR_DATA_TOGGLE)
const data = Button.getOrCreateInstance(button)
let data = Data.get(button, DATA_KEY)
if (!data) {
data = new Button(button)
}
data.toggle() data.toggle()
}) })

View File

@ -15,7 +15,6 @@ import {
triggerTransitionEnd, triggerTransitionEnd,
typeCheckConfig typeCheckConfig
} from './util/index' } from './util/index'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import Manipulator from './dom/manipulator' import Manipulator from './dom/manipulator'
import SelectorEngine from './dom/selector-engine' import SelectorEngine from './dom/selector-engine'
@ -219,7 +218,8 @@ class Carousel extends BaseComponent {
_getConfig(config) { _getConfig(config) {
config = { config = {
...Default, ...Default,
...config ...Manipulator.getDataAttributes(this._element),
...(typeof config === 'object' ? config : {})
} }
typeCheckConfig(NAME, config, DefaultType) typeCheckConfig(NAME, config, DefaultType)
return config return config
@ -496,25 +496,11 @@ class Carousel extends BaseComponent {
// Static // Static
static carouselInterface(element, config) { static carouselInterface(element, config) {
let data = Data.get(element, DATA_KEY) const data = Carousel.getOrCreateInstance(element, config)
let _config = {
...Default,
...Manipulator.getDataAttributes(element)
}
if (typeof config === 'object') {
_config = {
..._config,
...config
}
}
const { _config } = data
const action = typeof config === 'string' ? config : _config.slide const action = typeof config === 'string' ? config : _config.slide
if (!data) {
data = new Carousel(element, _config)
}
if (typeof config === 'number') { if (typeof config === 'number') {
data.to(config) data.to(config)
} else if (typeof action === 'string') { } else if (typeof action === 'string') {
@ -555,7 +541,7 @@ class Carousel extends BaseComponent {
Carousel.carouselInterface(target, config) Carousel.carouselInterface(target, config)
if (slideIndex) { if (slideIndex) {
Data.get(target, DATA_KEY).to(slideIndex) Carousel.getInstance(target).to(slideIndex)
} }
event.preventDefault() event.preventDefault()
@ -574,7 +560,7 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE) const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)
for (let i = 0, len = carousels.length; i < len; i++) { for (let i = 0, len = carousels.length; i < len; i++) {
Carousel.carouselInterface(carousels[i], Data.get(carousels[i], DATA_KEY)) Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))
} }
}) })

View File

@ -145,7 +145,7 @@ class Collapse extends BaseComponent {
const container = SelectorEngine.findOne(this._selector) const container = SelectorEngine.findOne(this._selector)
if (actives) { if (actives) {
const tempActiveData = actives.find(elem => container !== elem) const tempActiveData = actives.find(elem => container !== elem)
activesData = tempActiveData ? Data.get(tempActiveData, DATA_KEY) : null activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null
if (activesData && activesData._isTransitioning) { if (activesData && activesData._isTransitioning) {
return return
@ -310,7 +310,7 @@ class Collapse extends BaseComponent {
// Static // Static
static collapseInterface(element, config) { static collapseInterface(element, config) {
let data = Data.get(element, DATA_KEY) let data = Collapse.getInstance(element)
const _config = { const _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(element), ...Manipulator.getDataAttributes(element),
@ -358,7 +358,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
const selectorElements = SelectorEngine.find(selector) const selectorElements = SelectorEngine.find(selector)
selectorElements.forEach(element => { selectorElements.forEach(element => {
const data = Data.get(element, DATA_KEY) const data = Collapse.getInstance(element)
let config let config
if (data) { if (data) {
// update parent attribute // update parent attribute

View File

@ -19,7 +19,6 @@ import {
getNextActiveElement, getNextActiveElement,
typeCheckConfig typeCheckConfig
} from './util/index' } from './util/index'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import Manipulator from './dom/manipulator' import Manipulator from './dom/manipulator'
import SelectorEngine from './dom/selector-engine' import SelectorEngine from './dom/selector-engine'
@ -369,12 +368,7 @@ class Dropdown extends BaseComponent {
// Static // Static
static dropdownInterface(element, config) { static dropdownInterface(element, config) {
let data = Data.get(element, DATA_KEY) const data = Dropdown.getOrCreateInstance(element, config)
const _config = typeof config === 'object' ? config : null
if (!data) {
data = new Dropdown(element, _config)
}
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
@ -399,7 +393,7 @@ class Dropdown extends BaseComponent {
const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE) const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)
for (let i = 0, len = toggles.length; i < len; i++) { for (let i = 0, len = toggles.length; i < len; i++) {
const context = Data.get(toggles[i], DATA_KEY) const context = Dropdown.getInstance(toggles[i])
if (!context || context._config.autoClose === false) { if (!context || context._config.autoClose === false) {
continue continue
} }

View File

@ -209,7 +209,7 @@ class Modal extends BaseComponent {
config = { config = {
...Default, ...Default,
...Manipulator.getDataAttributes(this._element), ...Manipulator.getDataAttributes(this._element),
...config ...(typeof config === 'object' ? config : {})
} }
typeCheckConfig(NAME, config, DefaultType) typeCheckConfig(NAME, config, DefaultType)
return config return config
@ -389,7 +389,7 @@ class Modal extends BaseComponent {
static jQueryInterface(config, relatedTarget) { static jQueryInterface(config, relatedTarget) {
return this.each(function () { return this.each(function () {
const data = Modal.getInstance(this) || new Modal(this, typeof config === 'object' ? config : {}) const data = Modal.getOrCreateInstance(this, config)
if (typeof config !== 'string') { if (typeof config !== 'string') {
return return
@ -430,7 +430,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
}) })
}) })
const data = Modal.getInstance(target) || new Modal(target) const data = Modal.getOrCreateInstance(target)
data.toggle(this) data.toggle(this)
}) })

View File

@ -13,7 +13,6 @@ import {
typeCheckConfig typeCheckConfig
} from './util/index' } from './util/index'
import { hide as scrollBarHide, reset as scrollBarReset } from './util/scrollbar' import { hide as scrollBarHide, reset as scrollBarReset } from './util/scrollbar'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import BaseComponent from './base-component' import BaseComponent from './base-component'
import SelectorEngine from './dom/selector-engine' import SelectorEngine from './dom/selector-engine'
@ -211,7 +210,7 @@ class Offcanvas extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Data.get(this, DATA_KEY) || new Offcanvas(this, typeof config === 'object' ? config : {}) const data = Offcanvas.getOrCreateInstance(this, config)
if (typeof config !== 'string') { if (typeof config !== 'string') {
return return
@ -256,14 +255,13 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
Offcanvas.getInstance(allReadyOpen).hide() Offcanvas.getInstance(allReadyOpen).hide()
} }
const data = Data.get(target, DATA_KEY) || new Offcanvas(target) const data = Offcanvas.getOrCreateInstance(target)
data.toggle(this) data.toggle(this)
}) })
EventHandler.on(window, EVENT_LOAD_DATA_API, () => { EventHandler.on(window, EVENT_LOAD_DATA_API, () =>
SelectorEngine.find(OPEN_SELECTOR).forEach(el => (Data.get(el, DATA_KEY) || new Offcanvas(el)).show()) SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())
}) )
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------

View File

@ -6,7 +6,6 @@
*/ */
import { defineJQueryPlugin } from './util/index' import { defineJQueryPlugin } from './util/index'
import Data from './dom/data'
import SelectorEngine from './dom/selector-engine' import SelectorEngine from './dom/selector-engine'
import Tooltip from './tooltip' import Tooltip from './tooltip'
@ -146,13 +145,7 @@ class Popover extends Tooltip {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.get(this, DATA_KEY) const data = Popover.getOrCreateInstance(this, config)
const _config = typeof config === 'object' ? config : null
if (!data) {
data = new Popover(this, _config)
Data.set(this, DATA_KEY, data)
}
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {

View File

@ -270,7 +270,7 @@ class ScrollSpy extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = ScrollSpy.getInstance(this) || new ScrollSpy(this, typeof config === 'object' ? config : {}) const data = ScrollSpy.getOrCreateInstance(this, config)
if (typeof config !== 'string') { if (typeof config !== 'string') {
return return

View File

@ -11,7 +11,6 @@ import {
isDisabled, isDisabled,
reflow reflow
} from './util/index' } from './util/index'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import SelectorEngine from './dom/selector-engine' import SelectorEngine from './dom/selector-engine'
import BaseComponent from './base-component' import BaseComponent from './base-component'
@ -181,7 +180,7 @@ class Tab extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Data.get(this, DATA_KEY) || new Tab(this) const data = Tab.getOrCreateInstance(this)
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
@ -209,7 +208,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
return return
} }
const data = Data.get(this, DATA_KEY) || new Tab(this) const data = Tab.getOrCreateInstance(this)
data.show() data.show()
}) })

View File

@ -10,7 +10,6 @@ import {
reflow, reflow,
typeCheckConfig typeCheckConfig
} from './util/index' } from './util/index'
import Data from './dom/data'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import Manipulator from './dom/manipulator' import Manipulator from './dom/manipulator'
import BaseComponent from './base-component' import BaseComponent from './base-component'
@ -218,12 +217,7 @@ class Toast extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.get(this, DATA_KEY) const data = Toast.getOrCreateInstance(this, config)
const _config = typeof config === 'object' && config
if (!data) {
data = new Toast(this, _config)
}
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {

View File

@ -722,12 +722,7 @@ class Tooltip extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.get(this, DATA_KEY) const data = Tooltip.getOrCreateInstance(this, config)
const _config = typeof config === 'object' && config
if (!data) {
data = new Tooltip(this, _config)
}
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {

View File

@ -207,4 +207,26 @@ describe('Alert', () => {
expect(Alert.getInstance(div)).toEqual(null) expect(Alert.getInstance(div)).toEqual(null)
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return alert instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const alert = new Alert(div)
expect(Alert.getOrCreateInstance(div)).toEqual(alert)
expect(Alert.getInstance(div)).toEqual(Alert.getOrCreateInstance(div, {}))
expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert)
})
it('should return new instance when there is no alert instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Alert.getInstance(div)).toEqual(null)
expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert)
})
})
}) })

View File

@ -112,5 +112,22 @@ describe('Base Component', () => {
expect(DummyClass.getInstance(div)).toEqual(null) expect(DummyClass.getInstance(div)).toEqual(null)
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return an instance', () => {
createInstance()
expect(DummyClass.getOrCreateInstance(element)).toEqual(instance)
expect(DummyClass.getInstance(element)).toEqual(DummyClass.getOrCreateInstance(element, {}))
expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)
})
it('should return new instance when there is no alert instance', () => {
fixtureEl.innerHTML = '<div id="foo"></div>'
element = fixtureEl.querySelector('#foo')
expect(DummyClass.getInstance(element)).toEqual(null)
expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)
})
})
}) })
}) })

View File

@ -164,4 +164,26 @@ describe('Button', () => {
expect(Button.getInstance(div)).toEqual(null) expect(Button.getInstance(div)).toEqual(null)
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return button instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const button = new Button(div)
expect(Button.getOrCreateInstance(div)).toEqual(button)
expect(Button.getInstance(div)).toEqual(Button.getOrCreateInstance(div, {}))
expect(Button.getOrCreateInstance(div)).toBeInstanceOf(Button)
})
it('should return new instance when there is no button instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Button.getInstance(div)).toEqual(null)
expect(Button.getOrCreateInstance(div)).toBeInstanceOf(Button)
})
})
}) })

View File

@ -1202,6 +1202,60 @@ describe('Carousel', () => {
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return carousel instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const carousel = new Carousel(div)
expect(Carousel.getOrCreateInstance(div)).toEqual(carousel)
expect(Carousel.getInstance(div)).toEqual(Carousel.getOrCreateInstance(div, {}))
expect(Carousel.getOrCreateInstance(div)).toBeInstanceOf(Carousel)
})
it('should return new instance when there is no carousel instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Carousel.getInstance(div)).toEqual(null)
expect(Carousel.getOrCreateInstance(div)).toBeInstanceOf(Carousel)
})
it('should return new instance when there is no carousel instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Carousel.getInstance(div)).toEqual(null)
const carousel = Carousel.getOrCreateInstance(div, {
interval: 1
})
expect(carousel).toBeInstanceOf(Carousel)
expect(carousel._config.interval).toEqual(1)
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const carousel = new Carousel(div, {
interval: 1
})
expect(Carousel.getInstance(div)).toEqual(carousel)
const carousel2 = Carousel.getOrCreateInstance(div, {
interval: 2
})
expect(carousel).toBeInstanceOf(Carousel)
expect(carousel2).toEqual(carousel)
expect(carousel2._config.interval).toEqual(1)
})
})
describe('jQueryInterface', () => { describe('jQueryInterface', () => {
it('should create a carousel', () => { it('should create a carousel', () => {
fixtureEl.innerHTML = '<div></div>' fixtureEl.innerHTML = '<div></div>'

View File

@ -862,4 +862,58 @@ describe('Collapse', () => {
expect(Collapse.getInstance(div)).toEqual(null) expect(Collapse.getInstance(div)).toEqual(null)
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return collapse instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const collapse = new Collapse(div)
expect(Collapse.getOrCreateInstance(div)).toEqual(collapse)
expect(Collapse.getInstance(div)).toEqual(Collapse.getOrCreateInstance(div, {}))
expect(Collapse.getOrCreateInstance(div)).toBeInstanceOf(Collapse)
})
it('should return new instance when there is no collapse instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Collapse.getInstance(div)).toEqual(null)
expect(Collapse.getOrCreateInstance(div)).toBeInstanceOf(Collapse)
})
it('should return new instance when there is no collapse instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Collapse.getInstance(div)).toEqual(null)
const collapse = Collapse.getOrCreateInstance(div, {
toggle: false
})
expect(collapse).toBeInstanceOf(Collapse)
expect(collapse._config.toggle).toEqual(false)
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const collapse = new Collapse(div, {
toggle: false
})
expect(Collapse.getInstance(div)).toEqual(collapse)
const collapse2 = Collapse.getOrCreateInstance(div, {
toggle: true
})
expect(collapse).toBeInstanceOf(Collapse)
expect(collapse2).toEqual(collapse)
expect(collapse2._config.toggle).toEqual(false)
})
})
}) })

View File

@ -1991,6 +1991,60 @@ describe('Dropdown', () => {
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return dropdown instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const dropdown = new Dropdown(div)
expect(Dropdown.getOrCreateInstance(div)).toEqual(dropdown)
expect(Dropdown.getInstance(div)).toEqual(Dropdown.getOrCreateInstance(div, {}))
expect(Dropdown.getOrCreateInstance(div)).toBeInstanceOf(Dropdown)
})
it('should return new instance when there is no dropdown instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Dropdown.getInstance(div)).toEqual(null)
expect(Dropdown.getOrCreateInstance(div)).toBeInstanceOf(Dropdown)
})
it('should return new instance when there is no dropdown instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Dropdown.getInstance(div)).toEqual(null)
const dropdown = Dropdown.getOrCreateInstance(div, {
display: 'dynamic'
})
expect(dropdown).toBeInstanceOf(Dropdown)
expect(dropdown._config.display).toEqual('dynamic')
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const dropdown = new Dropdown(div, {
display: 'dynamic'
})
expect(Dropdown.getInstance(div)).toEqual(dropdown)
const dropdown2 = Dropdown.getOrCreateInstance(div, {
display: 'static'
})
expect(dropdown).toBeInstanceOf(Dropdown)
expect(dropdown2).toEqual(dropdown)
expect(dropdown2._config.display).toEqual('dynamic')
})
})
it('should open dropdown when pressing keydown or keyup', done => { it('should open dropdown when pressing keydown or keyup', done => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [
'<div class="dropdown">', '<div class="dropdown">',

View File

@ -1058,4 +1058,58 @@ describe('Modal', () => {
expect(Modal.getInstance(div)).toBeNull() expect(Modal.getInstance(div)).toBeNull()
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return modal instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const modal = new Modal(div)
expect(Modal.getOrCreateInstance(div)).toEqual(modal)
expect(Modal.getInstance(div)).toEqual(Modal.getOrCreateInstance(div, {}))
expect(Modal.getOrCreateInstance(div)).toBeInstanceOf(Modal)
})
it('should return new instance when there is no modal instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Modal.getInstance(div)).toEqual(null)
expect(Modal.getOrCreateInstance(div)).toBeInstanceOf(Modal)
})
it('should return new instance when there is no modal instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Modal.getInstance(div)).toEqual(null)
const modal = Modal.getOrCreateInstance(div, {
backdrop: true
})
expect(modal).toBeInstanceOf(Modal)
expect(modal._config.backdrop).toEqual(true)
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const modal = new Modal(div, {
backdrop: true
})
expect(Modal.getInstance(div)).toEqual(modal)
const modal2 = Modal.getOrCreateInstance(div, {
backdrop: false
})
expect(modal).toBeInstanceOf(Modal)
expect(modal2).toEqual(modal)
expect(modal2._config.backdrop).toEqual(true)
})
})
}) })

View File

@ -620,38 +620,6 @@ describe('Offcanvas', () => {
}).toThrowError(TypeError, `No method named "${action}"`) }).toThrowError(TypeError, `No method named "${action}"`)
}) })
it('should throw error on protected method', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const action = '_getConfig'
jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface
jQueryMock.elements = [div]
try {
jQueryMock.fn.offcanvas.call(jQueryMock, action)
} catch (error) {
expect(error.message).toEqual(`No method named "${action}"`)
}
})
it('should throw error if method "constructor" is being called', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const action = 'constructor'
jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface
jQueryMock.elements = [div]
try {
jQueryMock.fn.offcanvas.call(jQueryMock, action)
} catch (error) {
expect(error.message).toEqual(`No method named "${action}"`)
}
})
it('should call offcanvas method', () => { it('should call offcanvas method', () => {
fixtureEl.innerHTML = '<div></div>' fixtureEl.innerHTML = '<div></div>'
@ -675,8 +643,6 @@ describe('Offcanvas', () => {
jQueryMock.elements = [div] jQueryMock.elements = [div]
jQueryMock.fn.offcanvas.call(jQueryMock, { scroll: true }) jQueryMock.fn.offcanvas.call(jQueryMock, { scroll: true })
spyOn(Offcanvas.prototype, 'constructor')
expect(Offcanvas.prototype.constructor).not.toHaveBeenCalledWith(div, { scroll: true })
const offcanvas = Offcanvas.getInstance(div) const offcanvas = Offcanvas.getInstance(div)
expect(offcanvas).not.toBeNull() expect(offcanvas).not.toBeNull()
@ -703,4 +669,58 @@ describe('Offcanvas', () => {
expect(Offcanvas.getInstance(div)).toBeNull() expect(Offcanvas.getInstance(div)).toBeNull()
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return offcanvas instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const offcanvas = new Offcanvas(div)
expect(Offcanvas.getOrCreateInstance(div)).toEqual(offcanvas)
expect(Offcanvas.getInstance(div)).toEqual(Offcanvas.getOrCreateInstance(div, {}))
expect(Offcanvas.getOrCreateInstance(div)).toBeInstanceOf(Offcanvas)
})
it('should return new instance when there is no Offcanvas instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Offcanvas.getInstance(div)).toEqual(null)
expect(Offcanvas.getOrCreateInstance(div)).toBeInstanceOf(Offcanvas)
})
it('should return new instance when there is no offcanvas instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Offcanvas.getInstance(div)).toEqual(null)
const offcanvas = Offcanvas.getOrCreateInstance(div, {
scroll: true
})
expect(offcanvas).toBeInstanceOf(Offcanvas)
expect(offcanvas._config.scroll).toEqual(true)
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const offcanvas = new Offcanvas(div, {
scroll: true
})
expect(Offcanvas.getInstance(div)).toEqual(offcanvas)
const offcanvas2 = Offcanvas.getOrCreateInstance(div, {
scroll: false
})
expect(offcanvas).toBeInstanceOf(Offcanvas)
expect(offcanvas2).toEqual(offcanvas)
expect(offcanvas2._config.scroll).toEqual(true)
})
})
}) })

View File

@ -287,4 +287,58 @@ describe('Popover', () => {
expect(Popover.getInstance(popoverEl)).toEqual(null) expect(Popover.getInstance(popoverEl)).toEqual(null)
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return popover instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const popover = new Popover(div)
expect(Popover.getOrCreateInstance(div)).toEqual(popover)
expect(Popover.getInstance(div)).toEqual(Popover.getOrCreateInstance(div, {}))
expect(Popover.getOrCreateInstance(div)).toBeInstanceOf(Popover)
})
it('should return new instance when there is no popover instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Popover.getInstance(div)).toEqual(null)
expect(Popover.getOrCreateInstance(div)).toBeInstanceOf(Popover)
})
it('should return new instance when there is no popover instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Popover.getInstance(div)).toEqual(null)
const popover = Popover.getOrCreateInstance(div, {
placement: 'top'
})
expect(popover).toBeInstanceOf(Popover)
expect(popover._config.placement).toEqual('top')
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const popover = new Popover(div, {
placement: 'top'
})
expect(Popover.getInstance(div)).toEqual(popover)
const popover2 = Popover.getOrCreateInstance(div, {
placement: 'bottom'
})
expect(popover).toBeInstanceOf(Popover)
expect(popover2).toEqual(popover)
expect(popover2._config.placement).toEqual('top')
})
})
}) })

View File

@ -684,6 +684,60 @@ describe('ScrollSpy', () => {
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return scrollspy instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const scrollspy = new ScrollSpy(div)
expect(ScrollSpy.getOrCreateInstance(div)).toEqual(scrollspy)
expect(ScrollSpy.getInstance(div)).toEqual(ScrollSpy.getOrCreateInstance(div, {}))
expect(ScrollSpy.getOrCreateInstance(div)).toBeInstanceOf(ScrollSpy)
})
it('should return new instance when there is no scrollspy instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(ScrollSpy.getInstance(div)).toEqual(null)
expect(ScrollSpy.getOrCreateInstance(div)).toBeInstanceOf(ScrollSpy)
})
it('should return new instance when there is no scrollspy instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(ScrollSpy.getInstance(div)).toEqual(null)
const scrollspy = ScrollSpy.getOrCreateInstance(div, {
offset: 1
})
expect(scrollspy).toBeInstanceOf(ScrollSpy)
expect(scrollspy._config.offset).toEqual(1)
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const scrollspy = new ScrollSpy(div, {
offset: 1
})
expect(ScrollSpy.getInstance(div)).toEqual(scrollspy)
const scrollspy2 = ScrollSpy.getOrCreateInstance(div, {
offset: 2
})
expect(scrollspy).toBeInstanceOf(ScrollSpy)
expect(scrollspy2).toEqual(scrollspy)
expect(scrollspy2._config.offset).toEqual(1)
})
})
describe('event handler', () => { describe('event handler', () => {
it('should create scrollspy on window load event', () => { it('should create scrollspy on window load event', () => {
fixtureEl.innerHTML = '<div data-bs-spy="scroll"></div>' fixtureEl.innerHTML = '<div data-bs-spy="scroll"></div>'

View File

@ -433,6 +433,28 @@ describe('Tab', () => {
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return tab instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const tab = new Tab(div)
expect(Tab.getOrCreateInstance(div)).toEqual(tab)
expect(Tab.getInstance(div)).toEqual(Tab.getOrCreateInstance(div, {}))
expect(Tab.getOrCreateInstance(div)).toBeInstanceOf(Tab)
})
it('should return new instance when there is no tab instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Tab.getInstance(div)).toEqual(null)
expect(Tab.getOrCreateInstance(div)).toBeInstanceOf(Tab)
})
})
describe('data-api', () => { describe('data-api', () => {
it('should create dynamically a tab', done => { it('should create dynamically a tab', done => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [

View File

@ -591,4 +591,58 @@ describe('Toast', () => {
expect(Toast.getInstance(div)).toEqual(null) expect(Toast.getInstance(div)).toEqual(null)
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return toast instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const toast = new Toast(div)
expect(Toast.getOrCreateInstance(div)).toEqual(toast)
expect(Toast.getInstance(div)).toEqual(Toast.getOrCreateInstance(div, {}))
expect(Toast.getOrCreateInstance(div)).toBeInstanceOf(Toast)
})
it('should return new instance when there is no toast instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Toast.getInstance(div)).toEqual(null)
expect(Toast.getOrCreateInstance(div)).toBeInstanceOf(Toast)
})
it('should return new instance when there is no toast instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Toast.getInstance(div)).toEqual(null)
const toast = Toast.getOrCreateInstance(div, {
delay: 1
})
expect(toast).toBeInstanceOf(Toast)
expect(toast._config.delay).toEqual(1)
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const toast = new Toast(div, {
delay: 1
})
expect(Toast.getInstance(div)).toEqual(toast)
const toast2 = Toast.getOrCreateInstance(div, {
delay: 2
})
expect(toast).toBeInstanceOf(Toast)
expect(toast2).toEqual(toast)
expect(toast2._config.delay).toEqual(1)
})
})
}) })

View File

@ -3,7 +3,7 @@ import EventHandler from '../../src/dom/event-handler'
import { noop } from '../../src/util/index' import { noop } from '../../src/util/index'
/** Test helpers */ /** Test helpers */
import { getFixture, clearFixture, jQueryMock, createEvent } from '../helpers/fixture' import { clearFixture, createEvent, getFixture, jQueryMock } from '../helpers/fixture'
describe('Tooltip', () => { describe('Tooltip', () => {
let fixtureEl let fixtureEl
@ -1306,6 +1306,60 @@ describe('Tooltip', () => {
}) })
}) })
describe('getOrCreateInstance', () => {
it('should return tooltip instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const tooltip = new Tooltip(div)
expect(Tooltip.getOrCreateInstance(div)).toEqual(tooltip)
expect(Tooltip.getInstance(div)).toEqual(Tooltip.getOrCreateInstance(div, {}))
expect(Tooltip.getOrCreateInstance(div)).toBeInstanceOf(Tooltip)
})
it('should return new instance when there is no tooltip instance', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Tooltip.getInstance(div)).toEqual(null)
expect(Tooltip.getOrCreateInstance(div)).toBeInstanceOf(Tooltip)
})
it('should return new instance when there is no tooltip instance with given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
expect(Tooltip.getInstance(div)).toEqual(null)
const tooltip = Tooltip.getOrCreateInstance(div, {
title: () => 'test'
})
expect(tooltip).toBeInstanceOf(Tooltip)
expect(tooltip.getTitle()).toEqual('test')
})
it('should return the instance when exists without given configuration', () => {
fixtureEl.innerHTML = '<div></div>'
const div = fixtureEl.querySelector('div')
const tooltip = new Tooltip(div, {
title: () => 'nothing'
})
expect(Tooltip.getInstance(div)).toEqual(tooltip)
const tooltip2 = Tooltip.getOrCreateInstance(div, {
title: () => 'test'
})
expect(tooltip).toBeInstanceOf(Tooltip)
expect(tooltip2).toEqual(tooltip)
expect(tooltip2.getTitle()).toEqual('nothing')
})
})
describe('jQueryInterface', () => { describe('jQueryInterface', () => {
it('should create a tooltip', () => { it('should create a tooltip', () => {
fixtureEl.innerHTML = '<div></div>' fixtureEl.innerHTML = '<div></div>'

View File

@ -209,6 +209,15 @@ This makes an alert listen for click events on descendant elements which have th
Static method which allows you to get the alert instance associated to a DOM element, you can use it like this: <code>bootstrap.Alert.getInstance(alert)</code> Static method which allows you to get the alert instance associated to a DOM element, you can use it like this: <code>bootstrap.Alert.getInstance(alert)</code>
</td> </td>
</tr> </tr>
<tr>
<td>
<code>getOrCreateInstance</code>
</td>
<td>
Static method which returns an alert instance associated to a DOM element or create a new one in case it wasn't initialised.
You can use it like this: <code>bootstrap.Alert.getOrCreateInstance(element)</code>
</td>
</tr>
</tbody> </tbody>
</table> </table>

View File

@ -193,6 +193,23 @@ var bsButton = new bootstrap.Button(button)
Destroys an element's button. (Removes stored data on the DOM element) Destroys an element's button. (Removes stored data on the DOM element)
</td> </td>
</tr> </tr>
<tr>
<td>
<code>getInstance</code>
</td>
<td>
Static method which allows you to get the button instance associated to a DOM element, you can use it like this: <code>bootstrap.Button.getInstance(element)</code>
</td>
</tr>
<tr>
<td>
<code>getOrCreateInstance</code>
</td>
<td>
Static method which returns a button instance associated to a DOM element or create a new one in case it wasn't initialised.
You can use it like this: <code>bootstrap.Button.getOrCreateInstance(element)</code>
</td>
</tr>
</tbody> </tbody>
</table> </table>

View File

@ -413,8 +413,21 @@ var carousel = new bootstrap.Carousel(myCarousel, {
<td>Destroys an element's carousel. (Removes stored data on the DOM element)</td> <td>Destroys an element's carousel. (Removes stored data on the DOM element)</td>
</tr> </tr>
<tr> <tr>
<td><code>getInstance</code></td> <td>
<td>Static method which allows you to get the carousel instance associated with a DOM element.</td> <code>getInstance</code>
</td>
<td>
Static method which allows you to get the carousel instance associated to a DOM element, you can use it like this: <code>bootstrap.Carousel.getInstance(element)</code>
</td>
</tr>
<tr>
<td>
<code>getOrCreateInstance</code>
</td>
<td>
Static method which returns a carousel instance associated to a DOM element or create a new one in case it wasn't initialised.
You can use it like this: <code>bootstrap.Carousel.getOrCreateInstance(element)</code>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -187,8 +187,21 @@ var bsCollapse = new bootstrap.Collapse(myCollapse, {
<td>Destroys an element's collapse. (Removes stored data on the DOM element)</td> <td>Destroys an element's collapse. (Removes stored data on the DOM element)</td>
</tr> </tr>
<tr> <tr>
<td><code>getInstance</code></td> <td>
<td>Static method which allows you to get the collapse instance associated with a DOM element.</td> <code>getInstance</code>
</td>
<td>
Static method which allows you to get the collapse instance associated to a DOM element, you can use it like this: <code>bootstrap.Collapse.getInstance(element)</code>
</td>
</tr>
<tr>
<td>
<code>getOrCreateInstance</code>
</td>
<td>
Static method which returns a collapse instance associated to a DOM element or create a new one in case it wasn't initialised.
You can use it like this: <code>bootstrap.Collapse.getOrCreateInstance(element)</code>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -1136,9 +1136,20 @@ var dropdown = new bootstrap.Dropdown(element, {
</td> </td>
</tr> </tr>
<tr> <tr>
<td><code>getInstance</code></td>
<td> <td>
Static method which allows you to get the dropdown instance associated with a DOM element. <code>getInstance</code>
</td>
<td>
Static method which allows you to get the dropdown instance associated to a DOM element, you can use it like this: <code>bootstrap.Dropdown.getInstance(element)</code>
</td>
</tr>
<tr>
<td>
<code>getOrCreateInstance</code>
</td>
<td>
Static method which returns a dropdown instance associated to a DOM element or create a new one in case it wasn't initialised.
You can use it like this: <code>bootstrap.Dropdown.getOrCreateInstance(element)</code>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -484,6 +484,15 @@ var triggerEl = document.querySelector('#trigger')
var tab = bootstrap.Tab.getInstance(triggerEl) // Returns a Bootstrap tab instance var tab = bootstrap.Tab.getInstance(triggerEl) // Returns a Bootstrap tab instance
``` ```
#### getOrCreateInstance
*Static* method which allows you to get the tab instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var triggerEl = document.querySelector('#trigger')
var tab = bootstrap.Tab.getOrCreateInstance(triggerEl) // Returns a Bootstrap tab instance
```
### Events ### Events
When showing a new tab, the events fire in the following order: When showing a new tab, the events fire in the following order:

View File

@ -952,6 +952,15 @@ var myModalEl = document.getElementById('myModal')
var modal = bootstrap.Modal.getInstance(myModalEl) // Returns a Bootstrap modal instance var modal = bootstrap.Modal.getInstance(myModalEl) // Returns a Bootstrap modal instance
``` ```
#### getOrCreateInstance
*Static* method which allows you to get the modal instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var myModalEl = document.querySelector('#myModal')
var modal = bootstrap.Modal.getOrCreateInstance(myModalEl) // Returns a Bootstrap modal instance
```
### Events ### Events
Bootstrap's modal class exposes a few events for hooking into modal functionality. All modal events are fired at the modal itself (i.e. at the `<div class="modal">`). Bootstrap's modal class exposes a few events for hooking into modal functionality. All modal events are fired at the modal itself (i.e. at the `<div class="modal">`).

View File

@ -624,6 +624,15 @@ var triggerEl = document.querySelector('#trigger')
var tab = bootstrap.Tab.getInstance(triggerEl) // Returns a Bootstrap tab instance var tab = bootstrap.Tab.getInstance(triggerEl) // Returns a Bootstrap tab instance
``` ```
#### getOrCreateInstance
*Static* method which allows you to get the tab instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var triggerEl = document.querySelector('#trigger')
var tab = bootstrap.Tab.getOrCreateInstance(triggerEl) // Returns a Bootstrap tab instance
```
### Events ### Events
When showing a new tab, the events fire in the following order: When showing a new tab, the events fire in the following order:

View File

@ -241,6 +241,7 @@ var bsOffcanvas = new bootstrap.Offcanvas(myOffcanvas)
| `show` | Shows an offcanvas element. **Returns to the caller before the offcanvas element has actually been shown** (i.e. before the `shown.bs.offcanvas` event occurs).| | `show` | Shows an offcanvas element. **Returns to the caller before the offcanvas element has actually been shown** (i.e. before the `shown.bs.offcanvas` event occurs).|
| `hide` | Hides an offcanvas element. **Returns to the caller before the offcanvas element has actually been hidden** (i.e. before the `hidden.bs.offcanvas` event occurs).| | `hide` | Hides an offcanvas element. **Returns to the caller before the offcanvas element has actually been hidden** (i.e. before the `hidden.bs.offcanvas` event occurs).|
| `getInstance` | *Static* method which allows you to get the offcanvas instance associated with a DOM element | | `getInstance` | *Static* method which allows you to get the offcanvas instance associated with a DOM element |
| `getOrCreateInstance` | *Static* method which allows you to get the offcanvas instance associated with a DOM element, or create a new one in case it wasn't initialised |
{{< /bs-table >}} {{< /bs-table >}}
### Events ### Events

View File

@ -393,6 +393,15 @@ var exampleTriggerEl = document.getElementById('example')
var popover = bootstrap.Popover.getInstance(exampleTriggerEl) // Returns a Bootstrap popover instance var popover = bootstrap.Popover.getInstance(exampleTriggerEl) // Returns a Bootstrap popover instance
``` ```
#### getOrCreateInstance
*Static* method which allows you to get the popover instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var exampleTriggerEl = document.getElementById('example')
var popover = bootstrap.Popover.getOrCreateInstance(exampleTriggerEl) // Returns a Bootstrap popover instance
```
### Events ### Events
<table class="table"> <table class="table">

View File

@ -298,6 +298,15 @@ var scrollSpyContentEl = document.getElementById('content')
var scrollSpy = bootstrap.ScrollSpy.getInstance(scrollSpyContentEl) // Returns a Bootstrap scrollspy instance var scrollSpy = bootstrap.ScrollSpy.getInstance(scrollSpyContentEl) // Returns a Bootstrap scrollspy instance
``` ```
#### getOrCreateInstance
*Static* method which allows you to get the scrollspy instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var scrollSpyContentEl = document.getElementById('content')
var scrollSpy = bootstrap.ScrollSpy.getOrCreateInstance(scrollSpyContentEl) // Returns a Bootstrap scrollspy instance
```
### Options ### Options
Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-bs-`, as in `data-bs-offset=""`. Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-bs-`, as in `data-bs-offset=""`.

View File

@ -391,6 +391,24 @@ Hides an element's toast. Your toast will remain on the DOM but won't show anymo
toast.dispose() toast.dispose()
``` ```
#### getInstance
*Static* method which allows you to get the scrollspy instance associated with a DOM element
```js
var myToastEl = document.getElementById('myToastEl')
var myToast = bootstrap.Toast.getInstance(myToastEl) // Returns a Bootstrap toast instance
```
#### getOrCreateInstance
*Static* method which allows you to get the scrollspy instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var myToastEl = document.getElementById('myToastEl')
var myToast = bootstrap.Toast.getOrCreateInstance(myToastEl) // Returns a Bootstrap toast instance
```
### Events ### Events
<table class="table"> <table class="table">

View File

@ -417,6 +417,15 @@ var exampleTriggerEl = document.getElementById('example')
var tooltip = bootstrap.Tooltip.getInstance(exampleTriggerEl) // Returns a Bootstrap tooltip instance var tooltip = bootstrap.Tooltip.getInstance(exampleTriggerEl) // Returns a Bootstrap tooltip instance
``` ```
#### getOrCreateInstance
*Static* method which allows you to get the tooltip instance associated with a DOM element, or create a new one in case it wasn't initialised
```js
var exampleTriggerEl = document.getElementById('example')
var tooltip = bootstrap.Tooltip.getOrCreateInstance(exampleTriggerEl) // Returns a Bootstrap tooltip instance
```
### Events ### Events
<table class="table"> <table class="table">