Skip to content

Instantly share code, notes, and snippets.

@enten
Created April 21, 2019 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save enten/cae7376b6c2a706bc5234c71d7860c85 to your computer and use it in GitHub Desktop.
Save enten/cae7376b6c2a706bc5234c71d7860c85 to your computer and use it in GitHub Desktop.
Create observable that emits when image load event occurred on element.
/**
* Create observable that emits when image load event occurred on element.
*
* @param element
* @returns Observable on element's image load events
*/
export function fromImageLoadEvents(element: HTMLElement): Observable<HTMLImageElement> {
return new Observable<HTMLImageElement>(observable => {
const images: HTMLImageElement[] = [];
let loadListener: (event: ProgressEvent) => void;
let addLoadListener: (image: HTMLImageElement) => void;
let removeLoadListener: (image: HTMLImageElement) => void;
loadListener = (event: ProgressEvent) => {
const image = event.target as HTMLImageElement;
removeLoadListener(image);
observable.next(image);
};
addLoadListener = (image: HTMLImageElement) => {
images.push(image);
image.addEventListener('load', loadListener);
};
removeLoadListener = (image: HTMLImageElement) => {
images.splice(images.indexOf(image), 1);
image.removeEventListener('load', loadListener);
};
if (element instanceof HTMLImageElement) {
addLoadListener(element);
} else {
element.querySelectorAll('img').forEach(addLoadListener);
}
return () => images.forEach(removeLoadListener);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment