Browse Source

Merge pull request #1138 from zd-x/xzd-merge

DIYgod 2 years ago
parent
commit
455af3385f
7 changed files with 119 additions and 99 deletions
  1. 10 5
      src/js/contextmenu.js
  2. 9 12
      src/js/controller.js
  3. 1 7
      src/js/danmaku.js
  4. 20 8
      src/js/fullscreen.js
  5. 65 51
      src/js/hotkey.js
  6. 13 15
      src/js/player.js
  7. 1 1
      src/js/timer.js

+ 10 - 5
src/js/contextmenu.js

@@ -12,22 +12,23 @@ class ContextMenu {
             }
         });
 
-        this.player.container.addEventListener('contextmenu', (e) => {
+        this.contextmenuHandler = (e) => {
+            const event = e || window.event;
+            event.preventDefault();
+
             if (this.shown) {
                 this.hide();
                 return;
             }
 
-            const event = e || window.event;
-            event.preventDefault();
-
             const clientRect = this.player.container.getBoundingClientRect();
             this.show(event.clientX - clientRect.left, event.clientY - clientRect.top);
 
             this.player.template.mask.addEventListener('click', () => {
                 this.hide();
             });
-        });
+        };
+        this.player.container.addEventListener('contextmenu', this.contextmenuHandler);
     }
 
     show(x, y) {
@@ -62,6 +63,10 @@ class ContextMenu {
         this.shown = false;
         this.player.events.trigger('contextmenu_hide');
     }
+
+    destroy() {
+        this.player.container.removeEventListener('contextmenu', this.contextmenuHandler);
+    }
 }
 
 export default ContextMenu;

+ 9 - 12
src/js/controller.js

@@ -13,18 +13,11 @@ class Controller {
 
         this.autoHideTimer = 0;
         if (!utils.isMobile) {
-            this.player.container.addEventListener('mousemove', () => {
-                this.setAutoHide();
-            });
-            this.player.container.addEventListener('click', () => {
-                this.setAutoHide();
-            });
-            this.player.on('play', () => {
-                this.setAutoHide();
-            });
-            this.player.on('pause', () => {
-                this.setAutoHide();
-            });
+            this.setAutoHideHandler = this.setAutoHide.bind(this);
+            this.player.container.addEventListener('mousemove', this.setAutoHideHandler);
+            this.player.container.addEventListener('click', this.setAutoHideHandler);
+            this.player.on('play', this.setAutoHideHandler);
+            this.player.on('pause', this.setAutoHideHandler);
         }
 
         this.initPlayButton();
@@ -420,6 +413,10 @@ class Controller {
     }
 
     destroy() {
+        if (!utils.isMobile) {
+            this.player.container.removeEventListener('mousemove', this.setAutoHideHandler);
+            this.player.container.removeEventListener('click', this.setAutoHideHandler);
+        }
         clearTimeout(this.autoHideTimer);
     }
 }

+ 1 - 7
src/js/danmaku.js

@@ -309,13 +309,7 @@ class Danmaku {
     }
 
     htmlEncode(str) {
-        return str
-            .replace(/&/g, '&')
-            .replace(/</g, '&lt;')
-            .replace(/>/g, '&gt;')
-            .replace(/"/g, '&quot;')
-            .replace(/'/g, '&#x27;')
-            .replace(/\//g, '&#x2f;');
+        return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g, '&#x2f;');
     }
 
     resize() {

+ 20 - 8
src/js/fullscreen.js

@@ -12,7 +12,7 @@ class FullScreen {
             utils.setScrollPosition(this.lastScrollPosition);
         });
 
-        const fullscreenchange = () => {
+        this.fullscreenchange = () => {
             this.player.resize();
             if (this.isFullScreen('browser')) {
                 this.player.events.trigger('fullscreen');
@@ -21,7 +21,7 @@ class FullScreen {
                 this.player.events.trigger('fullscreen_cancel');
             }
         };
-        const docfullscreenchange = () => {
+        this.docfullscreenchange = () => {
             const fullEle = document.fullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
             if (fullEle && fullEle !== this.player.container) {
                 return;
@@ -35,13 +35,13 @@ class FullScreen {
             }
         };
         if (/Firefox/.test(navigator.userAgent)) {
-            document.addEventListener('mozfullscreenchange', docfullscreenchange);
-            document.addEventListener('fullscreenchange', docfullscreenchange);
+            document.addEventListener('mozfullscreenchange', this.docfullscreenchange);
+            document.addEventListener('fullscreenchange', this.docfullscreenchange);
         } else {
-            this.player.container.addEventListener('fullscreenchange', fullscreenchange);
-            this.player.container.addEventListener('webkitfullscreenchange', fullscreenchange);
-            document.addEventListener('msfullscreenchange', docfullscreenchange);
-            document.addEventListener('MSFullscreenChange', docfullscreenchange);
+            this.player.container.addEventListener('fullscreenchange', this.fullscreenchange);
+            this.player.container.addEventListener('webkitfullscreenchange', this.fullscreenchange);
+            document.addEventListener('msfullscreenchange', this.docfullscreenchange);
+            document.addEventListener('MSFullscreenChange', this.docfullscreenchange);
         }
     }
 
@@ -122,6 +122,18 @@ class FullScreen {
             this.request(type);
         }
     }
+
+    destroy() {
+        if (/Firefox/.test(navigator.userAgent)) {
+            document.removeEventListener('mozfullscreenchange', this.docfullscreenchange);
+            document.removeEventListener('fullscreenchange', this.docfullscreenchange);
+        } else {
+            this.player.container.removeEventListener('fullscreenchange', this.fullscreenchange);
+            this.player.container.removeEventListener('webkitfullscreenchange', this.fullscreenchange);
+            document.removeEventListener('msfullscreenchange', this.docfullscreenchange);
+            document.removeEventListener('MSFullscreenChange', this.docfullscreenchange);
+        }
+    }
 }
 
 export default FullScreen;

+ 65 - 51
src/js/hotkey.js

@@ -1,60 +1,74 @@
 class HotKey {
     constructor(player) {
-        if (player.options.hotkey) {
-            document.addEventListener('keydown', (e) => {
-                if (player.focus) {
-                    const tag = document.activeElement.tagName.toUpperCase();
-                    const editable = document.activeElement.getAttribute('contenteditable');
-                    if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {
-                        const event = e || window.event;
-                        let percentage;
-                        switch (event.keyCode) {
-                            case 32:
-                                event.preventDefault();
-                                player.toggle();
-                                break;
-                            case 37:
-                                event.preventDefault();
-                                if (player.options.live) {
-                                    break;
-                                }
-                                player.seek(player.video.currentTime - 5);
-                                player.controller.setAutoHide();
-                                break;
-                            case 39:
-                                event.preventDefault();
-                                if (player.options.live) {
-                                    break;
-                                }
-                                player.seek(player.video.currentTime + 5);
-                                player.controller.setAutoHide();
-                                break;
-                            case 38:
-                                event.preventDefault();
-                                percentage = player.volume() + 0.1;
-                                player.volume(percentage);
-                                break;
-                            case 40:
-                                event.preventDefault();
-                                percentage = player.volume() - 0.1;
-                                player.volume(percentage);
-                                break;
+        this.player = player;
+        this.doHotKeyHandler = this.doHotKey.bind(this);
+        this.cancelFullScreenHandler = this.cancelFullScreen.bind(this);
+        if (this.player.options.hotkey) {
+            document.addEventListener('keydown', this.doHotKeyHandler);
+        }
+
+        document.addEventListener('keydown', this.cancelFullScreenHandler);
+    }
+
+    doHotKey(e) {
+        if (this.player.focus) {
+            const tag = document.activeElement.tagName.toUpperCase();
+            const editable = document.activeElement.getAttribute('contenteditable');
+            if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {
+                const event = e || window.event;
+                let percentage;
+                switch (event.keyCode) {
+                    case 32:
+                        event.preventDefault();
+                        this.player.toggle();
+                        break;
+                    case 37:
+                        event.preventDefault();
+                        if (this.player.options.live) {
+                            break;
                         }
-                    }
+                        this.player.seek(this.player.video.currentTime - 5);
+                        this.player.controller.setAutoHide();
+                        break;
+                    case 39:
+                        event.preventDefault();
+                        if (this.player.options.live) {
+                            break;
+                        }
+                        this.player.seek(this.player.video.currentTime + 5);
+                        this.player.controller.setAutoHide();
+                        break;
+                    case 38:
+                        event.preventDefault();
+                        percentage = this.player.volume() + 0.1;
+                        this.player.volume(percentage);
+                        break;
+                    case 40:
+                        event.preventDefault();
+                        percentage = this.player.volume() - 0.1;
+                        this.player.volume(percentage);
+                        break;
                 }
-            });
+            }
         }
+    }
 
-        document.addEventListener('keydown', (e) => {
-            const event = e || window.event;
-            switch (event.keyCode) {
-                case 27:
-                    if (player.fullScreen.isFullScreen('web')) {
-                        player.fullScreen.cancel('web');
-                    }
-                    break;
-            }
-        });
+    cancelFullScreen(e) {
+        const event = e || window.event;
+        switch (event.keyCode) {
+            case 27:
+                if (this.player.fullScreen.isFullScreen('web')) {
+                    this.player.fullScreen.cancel('web');
+                }
+                break;
+        }
+    }
+
+    destroy() {
+        if (this.player.options.hotkey) {
+            document.removeEventListener('keydown', this.doHotKeyHandler);
+        }
+        document.removeEventListener('keydown', this.cancelFullScreenHandler);
     }
 }
 

+ 13 - 15
src/js/player.js

@@ -118,21 +118,14 @@ class DPlayer {
 
         this.setting = new Setting(this);
         this.plugins = {};
-
-        document.addEventListener(
-            'click',
-            () => {
-                this.focus = false;
-            },
-            true
-        );
-        this.container.addEventListener(
-            'click',
-            () => {
-                this.focus = true;
-            },
-            true
-        );
+        this.docClickFun = () => {
+            this.focus = false;
+        };
+        this.containerClickFun = () => {
+            this.focus = true;
+        };
+        document.addEventListener('click', this.docClickFun, true);
+        this.container.addEventListener('click', this.containerClickFun, true);
 
         this.paused = true;
 
@@ -632,6 +625,11 @@ class DPlayer {
     destroy() {
         instances.splice(instances.indexOf(this), 1);
         this.pause();
+        document.removeEventListener('click', this.docClickFun, true);
+        this.container.removeEventListener('click', this.containerClickFun, true);
+        this.fullScreen.destroy();
+        this.hotkey.destroy();
+        this.contextmenu.destroy();
         this.controller.destroy();
         this.timer.destroy();
         this.video.src = '';

+ 1 - 1
src/js/timer.js

@@ -8,7 +8,7 @@ class Timer {
             window.mozRequestAnimationFrame ||
             window.oRequestAnimationFrame ||
             window.msRequestAnimationFrame ||
-            function(callback) {
+            function (callback) {
                 window.setTimeout(callback, 1000 / 60);
             })();