ImageLoader.js 1.5 KB

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