diff --git a/js/src/offcanvas.js b/js/src/offcanvas.js index 8d1feb13bb78..619ad3dbd889 100644 --- a/js/src/offcanvas.js +++ b/js/src/offcanvas.js @@ -158,6 +158,10 @@ class Offcanvas extends BaseComponent { } dispose() { + if (this._isShown && !this._config.scroll) { + new ScrollBarHelper().reset() + } + this._backdrop.dispose() this._focustrap.deactivate() super.dispose() diff --git a/js/tests/unit/offcanvas.spec.js b/js/tests/unit/offcanvas.spec.js index 3b6c98c1004c..5a435cff4bce 100644 --- a/js/tests/unit/offcanvas.spec.js +++ b/js/tests/unit/offcanvas.spec.js @@ -621,6 +621,26 @@ describe('Offcanvas', () => { expect(offCanvas._focustrap).toBeNull() expect(Offcanvas.getInstance(offCanvasEl)).toBeNull() }) + + it('should reset scrollbars when disposing a shown offcanvas with disabled scroll', () => { + return new Promise(resolve => { + fixtureEl.innerHTML = '
' + + const offCanvasEl = fixtureEl.querySelector('div') + const offCanvas = new Offcanvas(offCanvasEl) + const spyReset = spyOn(ScrollBarHelper.prototype, 'reset').and.callThrough() + + offCanvasEl.addEventListener('shown.bs.offcanvas', () => { + offCanvas.dispose() + + expect(spyReset).toHaveBeenCalled() + expect(document.body.style.overflow).toEqual('') + resolve() + }) + + offCanvas.show() + }) + }) }) describe('data-api', () => {