ImageLoader.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { Cache } from './Cache.js';
  2. import { Loader } from './Loader.js';
  3. import { createElementNS } from '../utils.js';
  4. class ImageLoader extends Loader {
  5. constructor( manager ) {
  6. super( manager );
  7. }
  8. load( url, onLoad, onProgress, onError ) {
  9. if ( this.path !== undefined ) url = this.path + url;
  10. url = this.manager.resolveURL( url );
  11. const scope = this;
  12. const cached = Cache.get( url );
  13. if ( cached !== undefined ) {
  14. scope.manager.itemStart( url );
  15. setTimeout( function () {
  16. if ( onLoad ) onLoad( cached );
  17. scope.manager.itemEnd( url );
  18. }, 0 );
  19. return cached;
  20. }
  21. const image = createElementNS( 'img' );
  22. function onImageLoad() {
  23. image.removeEventListener( 'load', onImageLoad, false );
  24. image.removeEventListener( 'error', onImageError, false );
  25. Cache.add( url, this );
  26. if ( onLoad ) onLoad( this );
  27. scope.manager.itemEnd( url );
  28. }
  29. function onImageError( event ) {
  30. image.removeEventListener( 'load', onImageLoad, false );
  31. image.removeEventListener( 'error', onImageError, false );
  32. if ( onError ) onError( event );
  33. scope.manager.itemError( url );
  34. scope.manager.itemEnd( url );
  35. }
  36. image.addEventListener( 'load', onImageLoad, false );
  37. image.addEventListener( 'error', onImageError, false );
  38. if ( url.substr( 0, 5 ) !== 'data:' ) {
  39. if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
  40. }
  41. scope.manager.itemStart( url );
  42. image.src = url;
  43. return image;
  44. }
  45. }
  46. export { ImageLoader };