From 7503de27c590bf2ee2d0ba1c49fdddee0989901b Mon Sep 17 00:00:00 2001 From: ubermanu Date: Fri, 25 Jun 2021 14:44:37 +0200 Subject: [PATCH] Remove document event listener once the dropdown is disconnected --- src/shared/components/dropdown.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/shared/components/dropdown.js b/src/shared/components/dropdown.js index e0c7d91c2..f745693d5 100644 --- a/src/shared/components/dropdown.js +++ b/src/shared/components/dropdown.js @@ -9,13 +9,28 @@ const u = converse.env.utils; export class BaseDropdown extends CustomElement { + connectedCallback() { + super.connectedCallback(); + this.registerEvents(); + } + + registerEvents() { + this.clickOutside = this._clickOutside.bind(this); + document.addEventListener('click', this.clickOutside); + } + firstUpdated () { this.menu = this.querySelector('.dropdown-menu'); this.dropdown = this.firstElementChild; this.button = this.dropdown.querySelector('button'); this.dropdown.addEventListener('click', ev => this.toggleMenu(ev)); this.dropdown.addEventListener('keyup', ev => this.handleKeyUp(ev)); - document.addEventListener('click', ev => !this.contains(ev.composedPath()[0]) && this.hideMenu(ev)); + } + + _clickOutside(ev) { + if (!this.contains(ev.composedPath()[0])) { + this.hideMenu(ev); + } } hideMenu () { @@ -45,6 +60,11 @@ export class BaseDropdown extends CustomElement { this.enableArrowNavigation(ev); } } + + disconnectedCallback () { + document.removeEventListener('click', this.clickOutside); + super.disconnectedCallback(); + } } @@ -76,7 +96,6 @@ export default class DropdownList extends BaseDropdown { this.navigator.disable(); } - firstUpdated () { super.firstUpdated(); this.initArrowNavigation();