Просмотр исходного кода

ImageLoader: remove both 'load' and 'error' listeners immediately after either of load or error completes, prevents undesired GC references

Max Wagner 7 лет назад
Родитель
Сommit
923a8fdcdb
1 измененных файлов с 22 добавлено и 10 удалено
  1. 22 10
      src/loaders/ImageLoader.js

+ 22 - 10
src/loaders/ImageLoader.js

@@ -46,7 +46,12 @@ Object.assign( ImageLoader.prototype, {
 
 		var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );
 
-		image.addEventListener( 'load', function () {
+		var loadListener, errorListener;
+
+		loadListener = function () {
+
+			image.removeEventListener( 'load', loadListener, false );
+			image.removeEventListener( 'error', errorListener, false );
 
 			Cache.add( url, this );
 
@@ -54,24 +59,31 @@ Object.assign( ImageLoader.prototype, {
 
 			scope.manager.itemEnd( url );
 
-		}, false );
-
-		/*
-		image.addEventListener( 'progress', function ( event ) {
-
-			if ( onProgress ) onProgress( event );
+		};
 
-		}, false );
-		*/
+		errorListener = function ( event ) {
 
-		image.addEventListener( 'error', function ( event ) {
+			image.removeEventListener( 'load', loadListener, false );
+			image.removeEventListener( 'error', errorListener, false );
 
 			if ( onError ) onError( event );
 
 			scope.manager.itemEnd( url );
 			scope.manager.itemError( url );
 
+		};
+
+		image.addEventListener( 'load', loadListener, false );
+
+		/*
+		image.addEventListener( 'progress', function ( event ) {
+
+			if ( onProgress ) onProgress( event );
+
 		}, false );
+		*/
+
+		image.addEventListener( 'error', errorListener, false );
 
 		if ( url.substr( 0, 5 ) !== 'data:' ) {