Skip to content

Commit 6885d65

Browse files
committed
dropdown - destroy old popper.js references
1 parent a5e725f commit 6885d65

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

js/src/dropdown/dropdown.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,6 @@ class Dropdown {
155155

156156
// Disable totally Popper.js for Dropdown in Navbar
157157
if (!this._inNavbar) {
158-
/**
159-
* Check for Popper dependency
160-
* Popper - https://popper.js.org
161-
*/
162158
if (typeof Popper === 'undefined') {
163159
throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)')
164160
}
@@ -251,15 +247,15 @@ class Dropdown {
251247
EventHandler.off(this._element, EVENT_KEY)
252248
this._element = null
253249
this._menu = null
254-
if (this._popper !== null) {
250+
if (this._popper) {
255251
this._popper.destroy()
256252
this._popper = null
257253
}
258254
}
259255

260256
update() {
261257
this._inNavbar = this._detectNavbar()
262-
if (this._popper !== null) {
258+
if (this._popper) {
263259
this._popper.scheduleUpdate()
264260
}
265261
}
@@ -440,6 +436,10 @@ class Dropdown {
440436

441437
toggles[i].setAttribute('aria-expanded', 'false')
442438

439+
if (context._popper) {
440+
context._popper.destroy()
441+
}
442+
443443
dropdownMenu.classList.remove(ClassName.SHOW)
444444
parent.classList.remove(ClassName.SHOW)
445445
EventHandler.trigger(parent, Event.HIDDEN, relatedTarget)

js/src/dropdown/dropdown.spec.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,44 @@ describe('Dropdown', () => {
147147
dropdown.toggle()
148148
})
149149

150+
it('should destroy old popper references on toggle', done => {
151+
fixtureEl.innerHTML = [
152+
'<div class="first dropdown">',
153+
' <button href="#" class="firstBtn btn" data-toggle="dropdown" aria-expanded="false">Dropdown</button>',
154+
' <div class="dropdown-menu">',
155+
' <a class="dropdown-item" href="#">Secondary link</a>',
156+
' </div>',
157+
'</div>',
158+
'<div class="second dropdown">',
159+
' <button href="#" class="secondBtn btn" data-toggle="dropdown" aria-expanded="false">Dropdown</button>',
160+
' <div class="dropdown-menu">',
161+
' <a class="dropdown-item" href="#">Secondary link</a>',
162+
' </div>',
163+
'</div>'
164+
].join('')
165+
166+
const btnDropdown1 = fixtureEl.querySelector('.firstBtn')
167+
const btnDropdown2 = fixtureEl.querySelector('.secondBtn')
168+
const firstDropdownEl = fixtureEl.querySelector('.first')
169+
const secondDropdownEl = fixtureEl.querySelector('.second')
170+
const dropdown1 = new Dropdown(btnDropdown1)
171+
const dropdown2 = new Dropdown(btnDropdown2)
172+
173+
firstDropdownEl.addEventListener('shown.bs.dropdown', () => {
174+
expect(firstDropdownEl.classList.contains('show')).toEqual(true)
175+
spyOn(dropdown1._popper, 'destroy')
176+
dropdown2.toggle()
177+
done()
178+
})
179+
180+
secondDropdownEl.addEventListener('shown.bs.dropdown', () => {
181+
expect(dropdown1._popper.destroy).toHaveBeenCalled()
182+
done()
183+
})
184+
185+
dropdown1.toggle()
186+
})
187+
150188
it('should toggle a dropdown and add/remove event listener on mobile', done => {
151189
fixtureEl.innerHTML = [
152190
'<div class="dropdown">',

0 commit comments

Comments
 (0)