فهرست منبع

OSMD: add dispose() method (#16), disposes ResizeListener and InteractionManager

fix #16
sschmid 4 سال پیش
والد
کامیت
7f52b7b3e1
1فایلهای تغییر یافته به همراه24 افزوده شده و 1 حذف شده
  1. 24 1
      src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

+ 24 - 1
src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

@@ -90,6 +90,7 @@ export class OpenSheetMusicDisplay {
     protected rules: EngravingRules;
     protected autoResizeEnabled: boolean;
     private resizeHandlerAttached: boolean;
+    private disposeResizeListener: Function;
     protected followCursor: boolean;
     protected OnXMLRead: Function;
     public set PlaybackManager(manager: PlaybackManager) {
@@ -412,10 +413,20 @@ export class OpenSheetMusicDisplay {
 
     /** Clears what OSMD has drawn on its canvas. */
     public clear(): void {
-        this.drawer.clear();
+        this.drawer?.clear();
         this.reset(); // without this, resize will draw loaded sheet again
     }
 
+    /** Dispose listeners created by OSMD */
+    public dispose(): void {
+        if (this.disposeResizeListener) {
+            this.disposeResizeListener();
+        }
+        if (this.InteractionManager) {
+            this.InteractionManager.Dispose();
+        }
+    }
+
     /** Set OSMD rendering options using an IOSMDOptions object.
      *  Can be called during runtime. Also called by constructor.
      *  For example, setOptions({autoResize: false}) will disable autoResize even during runtime.
@@ -806,6 +817,18 @@ export class OpenSheetMusicDisplay {
         } else {
             window.addEventListener("resize", resizeStart);
         }
+
+        this.disposeResizeListener = (): void => {
+            if ((<any>window).detachEvent) {
+                // Support IE<9
+                (<any>window).detachEvent ("onresize", resizeStart);
+            } else {
+                window.removeEventListener("resize", resizeStart);
+            }
+
+            this.resizeHandlerAttached = false;
+        };
+
         this.resizeHandlerAttached = true;
 
         window.setTimeout(startCallback, 0);