From 75d749596205511e012cecbdd39123277244f462 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 27 Apr 2021 10:46:09 +0200 Subject: Autoclose settings on outside click --- .../videojs-components/settings-menu-button.ts | 27 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'client/src/assets/player/videojs-components/settings-menu-button.ts') diff --git a/client/src/assets/player/videojs-components/settings-menu-button.ts b/client/src/assets/player/videojs-components/settings-menu-button.ts index 011323267..e67a3da06 100644 --- a/client/src/assets/player/videojs-components/settings-menu-button.ts +++ b/client/src/assets/player/videojs-components/settings-menu-button.ts @@ -27,7 +27,7 @@ class SettingsButton extends Button { addSettingsItemHandler: typeof SettingsButton.prototype.onAddSettingsItem disposeSettingsItemHandler: typeof SettingsButton.prototype.onDisposeSettingsItem - playerClickHandler: typeof SettingsButton.prototype.onPlayerClick + documentClickHandler: typeof SettingsButton.prototype.onDocumentClick userInactiveHandler: typeof SettingsButton.prototype.onUserInactive private settingsButtonOptions: SettingsButtonOptions @@ -51,7 +51,7 @@ class SettingsButton extends Button { // Event handlers this.addSettingsItemHandler = this.onAddSettingsItem.bind(this) this.disposeSettingsItemHandler = this.onDisposeSettingsItem.bind(this) - this.playerClickHandler = this.onPlayerClick.bind(this) + this.documentClickHandler = this.onDocumentClick.bind(this) this.userInactiveHandler = this.onUserInactive.bind(this) this.buildMenu() @@ -61,9 +61,13 @@ class SettingsButton extends Button { this.player().one('play', () => this.hideDialog()) } - onPlayerClick (event: MouseEvent) { + onDocumentClick (event: MouseEvent) { const element = event.target as HTMLElement - if (element.classList.contains('vjs-settings') || element.parentElement.classList.contains('vjs-settings')) { + + if ( + element && element.classList && + (element.classList.contains('vjs-settings') || element.parentElement.classList.contains('vjs-settings')) + ) { return } @@ -91,6 +95,11 @@ class SettingsButton extends Button { } } + document.removeEventListener('click', this.documentClickHandler) + if (this.isInIframe()) { + window.removeEventListener('blur', this.documentClickHandler) + } + this.hideDialog() if (this.settingsButtonOptions.entries.length === 0) { @@ -112,7 +121,11 @@ class SettingsButton extends Button { } bindEvents () { - this.player().on('click', this.playerClickHandler) + document.addEventListener('click', this.documentClickHandler) + if (this.isInIframe()) { + window.addEventListener('blur', this.documentClickHandler) + } + this.player().on('addsettingsitem', this.addSettingsItemHandler) this.player().on('disposesettingsitem', this.disposeSettingsItemHandler) this.player().on('userinactive', this.userInactiveHandler) @@ -248,6 +261,10 @@ class SettingsButton extends Button { } } + isInIframe () { + return window.self !== window.top + } + } Component.registerComponent('SettingsButton', SettingsButton) -- cgit v1.2.3