mirror of https://github.com/twbs/bootstrap.git
Register only one `DOMContentLoaded` event listener in `onDOMContentLoaded` (#34158)
* refactor: reuse one DOMContentLoaded event listener in onDOMContentLoaded function Instead of adding an event listener everytime the utility function is called, cache the callbacks and execute them all at once. * refactor: drop iife for onDOMContentLoaded Co-authored-by: XhmikosR <xhmikosr@gmail.com>
This commit is contained in:
parent
56b000474c
commit
4927388197
|
@ -201,9 +201,18 @@ const getjQuery = () => {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DOMContentLoadedCallbacks = []
|
||||||
|
|
||||||
const onDOMContentLoaded = callback => {
|
const onDOMContentLoaded = callback => {
|
||||||
if (document.readyState === 'loading') {
|
if (document.readyState === 'loading') {
|
||||||
document.addEventListener('DOMContentLoaded', callback)
|
// add listener on the first call when the document is in loading state
|
||||||
|
if (!DOMContentLoadedCallbacks.length) {
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
DOMContentLoadedCallbacks.forEach(callback => callback())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
DOMContentLoadedCallbacks.push(callback)
|
||||||
} else {
|
} else {
|
||||||
callback()
|
callback()
|
||||||
}
|
}
|
||||||
|
|
|
@ -582,15 +582,24 @@ describe('Util', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('onDOMContentLoaded', () => {
|
describe('onDOMContentLoaded', () => {
|
||||||
it('should execute callback when DOMContentLoaded is fired', () => {
|
it('should execute callbacks when DOMContentLoaded is fired and should not add more than one listener', () => {
|
||||||
const spy = jasmine.createSpy()
|
const spy = jasmine.createSpy()
|
||||||
|
const spy2 = jasmine.createSpy()
|
||||||
|
|
||||||
|
spyOn(document, 'addEventListener').and.callThrough()
|
||||||
spyOnProperty(document, 'readyState').and.returnValue('loading')
|
spyOnProperty(document, 'readyState').and.returnValue('loading')
|
||||||
|
|
||||||
Util.onDOMContentLoaded(spy)
|
Util.onDOMContentLoaded(spy)
|
||||||
window.document.dispatchEvent(new Event('DOMContentLoaded', {
|
Util.onDOMContentLoaded(spy2)
|
||||||
|
|
||||||
|
document.dispatchEvent(new Event('DOMContentLoaded', {
|
||||||
bubbles: true,
|
bubbles: true,
|
||||||
cancelable: true
|
cancelable: true
|
||||||
}))
|
}))
|
||||||
|
|
||||||
expect(spy).toHaveBeenCalled()
|
expect(spy).toHaveBeenCalled()
|
||||||
|
expect(spy2).toHaveBeenCalled()
|
||||||
|
expect(document.addEventListener).toHaveBeenCalledTimes(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should execute callback if readyState is not "loading"', () => {
|
it('should execute callback if readyState is not "loading"', () => {
|
||||||
|
|
Loading…
Reference in New Issue