@egjs/imready
Version:
This module is used to wait for the image or video to be ready.
1 lines • 43.1 kB
Source Map (JSON)
{"version":3,"file":"imready.min.js","sources":["../src/consts.ts","../src/utils.ts","../src/AutoSizer.ts","../src/loaders/Loader.ts","../src/loaders/ElementLoader.ts","../src/ImReadyManager.ts","../src/loaders/ImageLoader.ts","../src/loaders/VideoLoader.ts","../src/ImReady.ts","../src/reactive.ts","../src/index.umd.ts"],"sourcesContent":["/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nconst isWindow = typeof window !== \"undefined\";\nconst ua = isWindow ? window.navigator.userAgent : \"\";\nexport const SUPPORT_COMPUTEDSTYLE = isWindow ? !!(\"getComputedStyle\" in window) : false;\nexport const IS_IE = /MSIE|Trident|Windows Phone|Edge/.test(ua);\nexport const SUPPORT_ADDEVENTLISTENER = isWindow ? !!(\"addEventListener\" in document) : false;\nexport const WIDTH = \"width\";\nexport const HEIGHT = \"height\";\n\nexport const PROPS = [\n \"prefix\",\n \"loaders\",\n] as const;\n\nexport const EVENTS = [\n \"preReadyElement\",\n \"readyElement\",\n \"error\",\n \"preReady\",\n \"ready\",\n] as const;\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport { ArrayFormat } from \"./types\";\n\nimport { SUPPORT_ADDEVENTLISTENER, SUPPORT_COMPUTEDSTYLE } from \"./consts\";\n\nexport function getAttribute(el: HTMLElement, name: string): string {\n return el.getAttribute(name) || \"\";\n}\n\nexport function toArray<T>(arr: ArrayFormat<T>): T[] {\n return [].slice.call(arr);\n}\nexport function hasSizeAttribute(target: HTMLElement, prefix = \"data-\"): boolean {\n return !!target.getAttribute(`${prefix}width`);\n}\nexport function hasLoadingAttribute(target: HTMLElement, prefix = \"data-\"): target is HTMLImageElement {\n return ((\"loading\" in target) && (target as HTMLImageElement).getAttribute(\"loading\") === \"lazy\")\n || !!target.getAttribute(`${prefix}lazy`);\n}\nexport function hasSkipAttribute(target: HTMLElement, prefix = \"data-\"): boolean {\n return !!target.getAttribute(`${prefix}skip`);\n}\nexport function addEvent(\n element: EventTarget,\n type: string,\n handler: (...args: any[]) => void,\n) {\n if (SUPPORT_ADDEVENTLISTENER) {\n element.addEventListener(type, handler, false);\n } else if ((element as any).attachEvent) {\n (element as any).attachEvent(`on${type}`, handler);\n } else {\n (element as any)[`on${type}`] = handler;\n }\n}\nexport function removeEvent(\n element: EventTarget,\n type: string,\n handler: (...args: any[]) => void,\n) {\n if (element.removeEventListener) {\n element.removeEventListener(type, handler, false);\n } else if ((element as any).detachEvent) {\n (element as any).detachEvent(`on${type}`, handler);\n } else {\n (element as any)[`on${type}`] = null;\n }\n}\n\nexport function innerWidth(el: HTMLElement) {\n return getSize(el, \"Width\");\n}\nexport function innerHeight(el: HTMLElement) {\n return getSize(el, \"Height\");\n}\nexport function getStyles(el: Element) {\n return (SUPPORT_COMPUTEDSTYLE ?\n window.getComputedStyle(el) : (el as any).currentStyle) || {};\n}\nfunction getSize(el: HTMLElement, name: \"Width\" | \"Height\") {\n const size = (el as any)[`client${name}`] || (el as any)[`offset${name}`];\n\n return parseFloat(size || getStyles(el)[name.toLowerCase()]) || 0;\n}\n\nexport function getContentElements(element: HTMLElement, tags: string[], prefix: string) {\n const skipElements = toArray(element.querySelectorAll([\n `[${prefix}skip] [${prefix}width]`,\n ...tags.map(tag => ([\n `[${prefix}skip] ${tag}`,\n `${tag}[${prefix}skip]`,\n `[${prefix}width] ${tag}`,\n ]).join(\", \")),\n ].join(\", \")));\n\n return toArray<HTMLElement>(\n element.querySelectorAll(`[${prefix}width], ${tags.join(\", \")}`),\n ).filter(el => {\n return skipElements.indexOf(el) === -1;\n });\n}\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport { addEvent, removeEvent, innerWidth, innerHeight, getAttribute } from \"./utils\";\nimport { WIDTH, HEIGHT } from \"./consts\";\nimport { AutoSizerElement } from \"./types\";\n\nconst elements: AutoSizerElement[] = [];\n\nexport function addAutoSizer(element: AutoSizerElement, prefix: string) {\n !elements.length && addEvent(window, \"resize\", resizeAllAutoSizers);\n element.__PREFIX__ = prefix;\n elements.push(element);\n resize(element);\n}\nexport function removeAutoSizer(element: AutoSizerElement, prefix: string) {\n const index = elements.indexOf(element);\n\n if (index < 0) {\n return;\n }\n const fixed = getAttribute(element, `${prefix}fixed`);\n\n delete element.__PREFIX__;\n element.style[fixed === HEIGHT ? WIDTH : HEIGHT] = \"\";\n elements.splice(index, 1);\n\n !elements.length && removeEvent(window, \"resize\", resizeAllAutoSizers);\n}\nfunction resize(element: AutoSizerElement, prefix = \"data-\") {\n const elementPrefix = element.__PREFIX__ || prefix;\n const dataWidth = parseInt(getAttribute(element, `${elementPrefix}${WIDTH}`), 10) || 0;\n const dataHeight = parseInt(getAttribute(element, `${elementPrefix}${HEIGHT}`), 10) || 0;\n const fixed = getAttribute(element, `${elementPrefix}fixed`);\n\n if (fixed === HEIGHT) {\n const size = innerHeight(element) || dataHeight;\n\n element.style[WIDTH] = `${dataWidth / dataHeight * size}px`;\n } else {\n const size = innerWidth(element) || dataWidth;\n\n element.style[HEIGHT] = `${dataHeight / dataWidth * size}px`;\n }\n}\nexport function resizeAllAutoSizers() {\n elements.forEach(element => {\n resize(element);\n });\n}\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport Component from \"@egjs/component\";\nimport { addAutoSizer, removeAutoSizer } from \"../AutoSizer\";\nimport { ImReadyLoaderEvents, ImReadyLoaderOptions } from \"../types\";\nimport { removeEvent, hasSizeAttribute, hasLoadingAttribute, addEvent, hasSkipAttribute } from \"../utils\";\n\n\nexport default abstract class Loader<T extends HTMLElement = any> extends Component<ImReadyLoaderEvents> {\n public static EVENTS: string[] = [];\n public options!: ImReadyLoaderOptions;\n public abstract checkElement(): boolean;\n protected element!: T;\n protected isReady = false;\n protected isPreReady = false;\n protected hasDataSize = false;\n protected hasLoading = false;\n protected isSkip = false;\n\n constructor(element: HTMLElement, options: Partial<ImReadyLoaderOptions> = {}) {\n super();\n this.options = {\n prefix: \"data-\",\n ...options,\n };\n this.element = element as T;\n const prefix = this.options.prefix;\n\n this.hasDataSize = hasSizeAttribute(element, prefix);\n this.isSkip = hasSkipAttribute(element, prefix);\n this.hasLoading = hasLoadingAttribute(element, prefix);\n }\n public check() {\n if (this.isSkip || !this.checkElement()) {\n // I'm Ready\n this.onAlreadyReady(true);\n return false;\n }\n\n if (this.hasDataSize) {\n addAutoSizer(this.element, this.options.prefix);\n }\n if (this.hasDataSize || this.hasLoading) {\n // I'm Pre Ready\n this.onAlreadyPreReady();\n }\n // Wati Pre Ready, Ready\n return true;\n }\n public addEvents() {\n const element = this.element;\n (this.constructor as typeof Loader).EVENTS.forEach(name => {\n addEvent(element, name, this.onCheck);\n });\n }\n public clear() {\n const element = this.element;\n (this.constructor as typeof Loader).EVENTS.forEach(name => {\n removeEvent(element, name, this.onCheck);\n });\n this.removeAutoSizer();\n }\n public destroy() {\n this.clear();\n this.off();\n }\n public removeAutoSizer() {\n if (this.hasDataSize) {\n // I'm already ready.\n const { prefix } = this.options;\n\n removeAutoSizer(this.element, prefix);\n }\n }\n public onCheck = (e?: Event) => {\n this.clear();\n\n\n if (e && e.type === \"error\") {\n this.onError(this.element);\n }\n if (this.hasLoading && this.checkElement()) {\n // I'm not ready\n return;\n }\n // I'm pre-ready and ready!\n const withPreReady = !this.hasDataSize && !this.hasLoading;\n\n this.onReady(withPreReady);\n };\n public onError(target: HTMLElement) {\n this.trigger(\"error\", {\n element: this.element,\n target: target,\n });\n }\n public onPreReady() {\n if (this.isPreReady) {\n return;\n }\n this.isPreReady = true;\n this.trigger(\"preReady\", {\n element: this.element,\n hasLoading: this.hasLoading,\n isSkip: this.isSkip,\n });\n }\n public onReady(withPreReady: boolean) {\n if (this.isReady) {\n return;\n }\n withPreReady = !this.isPreReady && withPreReady;\n\n if (withPreReady) {\n this.isPreReady = true;\n }\n this.removeAutoSizer();\n this.isReady = true;\n this.trigger(\"ready\", {\n element: this.element,\n withPreReady,\n hasLoading: this.hasLoading,\n isSkip: this.isSkip,\n });\n }\n public onAlreadyError(target: HTMLElement) {\n setTimeout(() => {\n this.onError(target);\n });\n }\n public onAlreadyPreReady() {\n setTimeout(() => {\n this.onPreReady();\n });\n }\n public onAlreadyReady(withPreReady: boolean) {\n setTimeout(() => {\n this.onReady(withPreReady);\n });\n }\n}\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport { addAutoSizer } from \"../AutoSizer\";\nimport { ImReadyLoaderOptions } from \"../types\";\nimport Loader from \"./Loader\";\n\n\nexport class ElementLoader<T extends HTMLElement> extends Loader<T> {\n public static EVENTS: string[] = [];\n public options!: ImReadyLoaderOptions;\n\n public setHasLoading(hasLoading: boolean) {\n this.hasLoading = hasLoading;\n }\n public check() {\n if (this.isSkip) {\n // I'm Ready\n this.onAlreadyReady(true);\n return false;\n }\n\n if (this.hasDataSize) {\n addAutoSizer(this.element, this.options.prefix);\n this.onAlreadyPreReady();\n } else {\n // has not data size\n this.trigger(\"requestChildren\");\n }\n return true;\n }\n public checkElement() {\n return true;\n }\n public destroy() {\n this.clear();\n this.trigger(\"requestDestroy\");\n this.off();\n }\n public onAlreadyPreReady() {\n // has data size\n super.onAlreadyPreReady();\n this.trigger(\"reqeustReadyChildren\");\n }\n}\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport Component, { ComponentEvent } from \"@egjs/component\";\nimport { ElementLoader } from \"./loaders/ElementLoader\";\nimport { ArrayFormat, ElementInfo, ImReadyEvents, ImReadyLoaderOptions, ImReadyOptions } from \"./types\";\nimport { toArray, getContentElements, hasLoadingAttribute } from \"./utils\";\n/**\n * @alias eg.ImReady\n * @extends eg.Component\n */\nclass ImReadyManager extends Component<ImReadyEvents> {\n public options!: ImReadyOptions;\n private readyCount = 0;\n private preReadyCount = 0;\n private totalCount = 0;\n private totalErrorCount = 0;\n private isPreReadyOver = true;\n private elementInfos: ElementInfo[] = [];\n /**\n * @param - ImReady's options\n */\n constructor(options: Partial<ImReadyOptions> = {}) {\n super();\n this.options = {\n loaders: {},\n prefix: \"data-\",\n ...options,\n };\n }\n /**\n * Checks whether elements are in the ready state.\n * @ko 엘리먼트가 준비 상태인지 체크한다.\n * @elements - Elements to check ready status. <ko> 준비 상태를 체크할 엘리먼트들.</ko>\n * @example\n * ```html\n * <div>\n * <img src=\"./1.jpg\" data-width=\"1280\" data-height=\"853\" style=\"width:100%\"/>\n * <img src=\"./2.jpg\" data-width=\"1280\" data-height=\"853\"/>\n * <img src=\"ERR\" data-width=\"1280\" data-height=\"853\"/>\n * </div>\n * ```\n * ## Javascript\n * ```js\n * import ImReady from \"@egjs/imready\";\n *\n * const im = new ImReady(); // umd: eg.ImReady\n * im.check(document.querySelectorAll(\"img\")).on({\n * preReadyElement: e => {\n * // 1, 3\n * // 2, 3\n * // 3, 3\n * console.log(e.preReadyCount, e.totalCount),\n * },\n * });\n * ```\n */\n public check(elements: ArrayFormat<HTMLElement>): this {\n const { prefix } = this.options;\n\n this.clear();\n this.elementInfos = toArray(elements).map((element, index) => {\n const loader = this.getLoader(element, { prefix });\n\n loader.check();\n loader.on(\"error\", e => {\n this.onError(index, e.target);\n }).on(\"preReady\", e => {\n const info = this.elementInfos[index];\n\n info.hasLoading = e.hasLoading;\n info.isSkip = e.isSkip;\n const isPreReady = this.checkPreReady(index);\n\n this.onPreReadyElement(index);\n\n isPreReady && this.onPreReady();\n }).on(\"ready\", ({ withPreReady, hasLoading, isSkip }) => {\n const info = this.elementInfos[index];\n\n info.hasLoading = hasLoading;\n info.isSkip = isSkip;\n\n const isPreReady = withPreReady && this.checkPreReady(index);\n const isReady = this.checkReady(index);\n\n // Pre-ready and ready occur simultaneously\n withPreReady && this.onPreReadyElement(index);\n this.onReadyElement(index);\n\n isPreReady && this.onPreReady();\n isReady && this.onReady();\n });\n\n return {\n loader,\n element,\n hasLoading: false,\n hasError: false,\n isPreReady: false,\n isReady: false,\n isSkip: false,\n };\n });\n\n const length = this.elementInfos.length;\n\n this.totalCount = length;\n if (!length) {\n setTimeout(() => {\n this.onPreReady();\n this.onReady();\n });\n }\n return this;\n }\n /**\n * Gets the total count of elements to be checked.\n * @ko 체크하는 element의 총 개수를 가져온다.\n */\n public getTotalCount() {\n return this.totalCount;\n }\n /**\n * Whether the elements are all pre-ready. (all sizes are known)\n * @ko 엘리먼트들이 모두 사전 준비가 됐는지 (사이즈를 전부 알 수 있는지) 여부.\n */\n public isPreReady() {\n return this.elementInfos.every(info => info.isPreReady);\n }\n /**\n * Whether the elements are all ready.\n * @ko 엘리먼트들이 모두 준비가 됐는지 여부.\n */\n public isReady() {\n return this.elementInfos.every(info => info.isReady);\n }\n /**\n * Whether an error has occurred in the elements in the current state.\n * @ko 현재 상태에서 엘리먼트들이 에러가 발생했는지 여부.\n */\n public hasError() {\n return this.totalErrorCount > 0;\n }\n /**\n * Clears events of elements being checked.\n * @ko 체크 중인 엘리먼트들의 이벤트를 해제 한다.\n */\n public clear() {\n this.isPreReadyOver = false;\n this.totalCount = 0;\n this.preReadyCount = 0;\n this.readyCount = 0;\n this.totalErrorCount = 0;\n this.elementInfos.forEach(info => {\n if (info.loader) {\n info.loader.destroy();\n }\n });\n this.elementInfos = [];\n }\n /**\n * Destory all events.\n * @ko 모든 이벤트를 해제 한다.\n */\n public destroy() {\n this.clear();\n this.off();\n }\n private getLoader(element: HTMLElement, options: ImReadyLoaderOptions) {\n const tagName = element.tagName.toLowerCase();\n const loaders = this.options.loaders;\n const prefix = options.prefix;\n const tags = Object.keys(loaders);\n\n if (loaders[tagName]) {\n return new loaders[tagName](element, options);\n }\n const loader = new ElementLoader(element, options);\n const children = toArray(element.querySelectorAll<HTMLElement>(tags.join(\", \")));\n\n loader.setHasLoading(children.some(el => hasLoadingAttribute(el, prefix)));\n let withPreReady = false;\n\n const childrenImReady = this.clone().on(\"error\", e => {\n loader.onError(e.target);\n }).on(\"ready\", () => {\n loader.onReady(withPreReady);\n });\n\n loader.on(\"requestChildren\", () => {\n // has not data size\n const contentElements = getContentElements(element, tags, this.options.prefix);\n\n childrenImReady.check(contentElements).on(\"preReady\", e => {\n withPreReady = e.isReady;\n if (!withPreReady) {\n loader.onPreReady();\n }\n });\n }).on(\"reqeustReadyChildren\", () => {\n // has data size\n // loader call preReady\n // check only video, image elements\n childrenImReady.check(children);\n }).on(\"requestDestroy\", () => {\n childrenImReady.destroy();\n });\n\n return loader;\n }\n private clone() {\n return new ImReadyManager({ ...this.options });\n }\n private checkPreReady(index: number) {\n this.elementInfos[index].isPreReady = true;\n ++this.preReadyCount;\n\n\n if (this.preReadyCount < this.totalCount) {\n return false;\n }\n return true;\n }\n private checkReady(index: number) {\n this.elementInfos[index].isReady = true;\n ++this.readyCount;\n\n if (this.readyCount < this.totalCount) {\n return false;\n }\n return true;\n }\n\n\n private onError(index: number, target: HTMLElement) {\n const info = this.elementInfos[index];\n\n info.hasError = true;\n /**\n * An event occurs if the image, video fails to load.\n * @ko 이미지, 비디오가 로딩에 실패하면 이벤트가 발생한다.\n * @event eg.ImReady#error\n * @param {eg.ImReady.OnError} e - The object of data to be sent to an event <ko>이벤트에 전달되는 데이터 객체</ko>\n * @example\n * ```html\n * <div>\n * <img src=\"./1.jpg\" data-width=\"1280\" data-height=\"853\" style=\"width:100%\"/>\n * <img src=\"./2.jpg\"/>\n * <img src=\"ERR\"/>\n * </div>\n * ```\n * ## Javascript\n * ```js\n * import ImReady from \"@egjs/imready\";\n *\n * const im = new ImReady(); // umd: eg.ImReady\n * im.check([document.querySelector(\"div\")]).on({\n * error: e => {\n * // <div>...</div>, 0, <img src=\"ERR\"/>\n * console.log(e.element, e.index, e.target),\n * },\n * });\n * ```\n */\n this.trigger(new ComponentEvent(\"error\", {\n element: info.element,\n index,\n target,\n errorCount: this.getErrorCount(),\n totalErrorCount: ++this.totalErrorCount,\n }));\n }\n private onPreReadyElement(index: number) {\n const info = this.elementInfos[index];\n /**\n * An event occurs when the element is pre-ready (when the loading attribute is applied or the size is known)\n * @ko 해당 엘리먼트가 사전 준비되었을 때(loading 속성이 적용되었거나 사이즈를 알 수 있을 때) 이벤트가 발생한다.\n * @event eg.ImReady#preReadyElement\n * @param {eg.ImReady.OnPreReadyElement} e - The object of data to be sent to an event <ko>이벤트에 전달되는 데이터 객체</ko>\n * @example\n * ```html\n * <div>\n * <img src=\"./1.jpg\" data-width=\"1280\" data-height=\"853\" style=\"width:100%\"/>\n * <img src=\"./2.jpg\" data-width=\"1280\" data-height=\"853\"/>\n * <img src=\"ERR\" data-width=\"1280\" data-height=\"853\"/>\n * </div>\n * ```\n * ## Javascript\n * ```js\n * import ImReady from \"@egjs/imready\";\n *\n * const im = new ImReady(); // umd: eg.ImReady\n * im.check(document.querySelectorAll(\"img\")).on({\n * preReadyElement: e => {\n * // 1, 3\n * // 2, 3\n * // 3, 3\n * console.log(e.preReadyCount, e.totalCount),\n * },\n * });\n * ```\n */\n this.trigger(new ComponentEvent(\"preReadyElement\", {\n element: info.element,\n index,\n\n preReadyCount: this.preReadyCount,\n readyCount: this.readyCount,\n totalCount: this.totalCount,\n\n isPreReady: this.isPreReady(),\n isReady: this.isReady(),\n hasLoading: info.hasLoading,\n isSkip: info.isSkip,\n }));\n }\n private onPreReady() {\n this.isPreReadyOver = true;\n /**\n * An event occurs when all element are pre-ready (When all elements have the loading attribute applied or the size is known)\n * @ko 모든 엘리먼트들이 사전 준비된 경우 (모든 엘리먼트들이 loading 속성이 적용되었거나 사이즈를 알 수 있는 경우) 이벤트가 발생한다.\n * @event eg.ImReady#preReady\n * @param {eg.ImReady.OnPreReady} e - The object of data to be sent to an event <ko>이벤트에 전달되는 데이터 객체</ko>\n * @example\n * ```html\n * <div>\n * <img src=\"./1.jpg\" data-width=\"1280\" data-height=\"853\" style=\"width:100%\"/>\n * <img src=\"./2.jpg\" data-width=\"1280\" data-height=\"853\"/>\n * <img src=\"ERR\" data-width=\"1280\" data-height=\"853\"/>\n * </div>\n * ```\n * ## Javascript\n * ```js\n * import ImReady from \"@egjs/imready\";\n *\n * const im = new ImReady(); // umd: eg.ImReady\n * im.check(document.querySelectorAll(\"img\")).on({\n * preReady: e => {\n * // 0, 3\n * console.log(e.readyCount, e.totalCount),\n * },\n * });\n * ```\n */\n this.trigger(new ComponentEvent(\"preReady\", {\n readyCount: this.readyCount,\n totalCount: this.totalCount,\n isReady: this.isReady(),\n hasLoading: this.hasLoading(),\n }));\n }\n private onReadyElement(index: number) {\n const info = this.elementInfos[index];\n /**\n * An event occurs when the element is ready\n * @ko 해당 엘리먼트가 준비가 되었을 때 이벤트가 발생한다.\n * @event eg.ImReady#readyElement\n * @param {eg.ImReady.OnReadyElement} e - The object of data to be sent to an event <ko>이벤트에 전달되는 데이터 객체</ko>\n * @example\n * ```html\n * <div>\n * <img src=\"./1.jpg\" data-width=\"1280\" data-height=\"853\" style=\"width:100%\"/>\n * <img src=\"./2.jpg\" data-width=\"1280\" data-height=\"853\"/>\n * <img src=\"ERR\" data-width=\"1280\" data-height=\"853\"/>\n * </div>\n * ```\n * ## Javascript\n * ```js\n * import ImReady from \"@egjs/imready\";\n *\n * const im = new ImReady(); // umd: eg.ImReady\n * im.check(document.querySelectorAll(\"img\")).on({\n * readyElement: e => {\n * // 1, 0, false, 3\n * // 2, 1, false, 3\n * // 3, 2, true, 3\n * console.log(e.readyCount, e.index, e.hasError, e.totalCount),\n * },\n * });\n * ```\n */\n this.trigger(new ComponentEvent(\"readyElement\", {\n index,\n element: info.element,\n\n hasError: info.hasError,\n errorCount: this.getErrorCount(),\n totalErrorCount: this.totalErrorCount,\n\n preReadyCount: this.preReadyCount,\n readyCount: this.readyCount,\n totalCount: this.totalCount,\n\n isPreReady: this.isPreReady(),\n isReady: this.isReady(),\n\n hasLoading: info.hasLoading,\n isPreReadyOver: this.isPreReadyOver,\n isSkip: info.isSkip,\n }));\n }\n private onReady() {\n /**\n * An event occurs when all element are ready\n * @ko 모든 엘리먼트들이 준비된 경우 이벤트가 발생한다.\n * @event eg.ImReady#ready\n * @param {eg.ImReady.OnReady} e - The object of data to be sent to an event <ko>이벤트에 전달되는 데이터 객체</ko>\n * @example\n * ```html\n * <div>\n * <img src=\"./1.jpg\" data-width=\"1280\" data-height=\"853\" style=\"width:100%\"/>\n * <img src=\"./2.jpg\" data-width=\"1280\" data-height=\"853\"/>\n * <img src=\"ERR\" data-width=\"1280\" data-height=\"853\"/>\n * </div>\n * ```\n * ## Javascript\n * ```js\n * import ImReady from \"@egjs/imready\";\n *\n * const im = new ImReady(); // umd: eg.ImReady\n * im.check(document.querySelectorAll(\"img\")).on({\n * preReady: e => {\n * // 0, 3\n * console.log(e.readyCount, e.totalCount),\n * },\n * ready: e => {\n * // 1, 3\n * console.log(e.errorCount, e.totalCount),\n * },\n * });\n * ```\n */\n this.trigger(new ComponentEvent(\"ready\", {\n errorCount: this.getErrorCount(),\n totalErrorCount: this.totalErrorCount,\n totalCount: this.totalCount,\n }));\n }\n private getErrorCount() {\n return this.elementInfos.filter(info => info.hasError).length;\n }\n private hasLoading() {\n return this.elementInfos.some(info => info.hasLoading);\n }\n}\n\nexport default ImReadyManager;\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport { IS_IE } from \"../consts\";\nimport Loader from \"./Loader\";\n\nexport default class ImageLoader extends Loader<HTMLImageElement> {\n public static EVENTS = [\"load\", \"error\"];\n public checkElement() {\n const element = this.element;\n const src = element.getAttribute(\"src\");\n\n if (element.complete) {\n if (src) {\n // complete\n if (!element.naturalWidth) {\n this.onAlreadyError(element);\n }\n return false;\n } else {\n // Using an external lazy loading module\n this.onAlreadyPreReady();\n }\n }\n this.addEvents();\n IS_IE && element.setAttribute(\"src\", src!);\n return true;\n }\n}\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport Loader from \"./Loader\";\n\nexport default class VideoLoader extends Loader<HTMLVideoElement> {\n public static EVENTS = [\"loadedmetadata\", \"error\"];\n public checkElement() {\n const element = this.element;\n // HAVE_NOTHING: 0, no information whether or not the audio/video is ready\n // HAVE_METADATA: 1, HAVE_METADATA - metadata for the audio/video is ready\n // HAVE_CURRENT_DATA: 2, data for the current playback position is available, but not enough data to play next frame/millisecond\n // HAVE_FUTURE_DATA: 3, data for the current and at least the next frame is available\n // HAVE_ENOUGH_DATA: 4, enough data available to start playing\n if (element.readyState >= 1) {\n return false;\n }\n if (element.error) {\n this.onAlreadyError(element);\n return false;\n }\n this.addEvents();\n return true;\n }\n}\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport ImReadyManager from \"./ImReadyManager\";\nimport ImageLoader from \"./loaders/ImageLoader\";\nimport VideoLoader from \"./loaders/VideoLoader\";\nimport { ImReadyOptions } from \"./types\";\n\nclass ImReady extends ImReadyManager {\n constructor(options: Partial<ImReadyOptions> = {}) {\n super({\n loaders: {\n img: ImageLoader,\n video: VideoLoader,\n },\n ...options,\n });\n }\n}\n\nexport default ImReady;\n","import {\n reactive,\n ReactiveSetupAdapter,\n ReactiveObject,\n Ref,\n isString,\n} from \"@cfcs/core\";\nimport { EVENTS } from \"./consts\";\nimport ImReady from \"./ImReady\";\nimport {\n ImReadyEvents,\n ImReadyReactiveProps,\n ImReadyReactiveState,\n} from \"./types\";\nimport { toArray } from \"./utils\";\n\n\nexport type ReactiveImReady = ReactiveObject<{\n preReadyCount: number;\n readyCount: number;\n errorCount: number;\n totalErrorCount: number;\n totalCount: number;\n isPreReady: boolean;\n isReady: boolean;\n hasError: boolean;\n isPreReadyOver: boolean;\n add(element: HTMLElement): void;\n}>;\n\nexport const REACTIVE_IMREADY: ReactiveSetupAdapter<\n ReactiveImReady,\n ImReadyReactiveState,\n \"add\",\n Partial<ImReadyReactiveProps>,\n ImReadyEvents\n> = ({ setEvents, setMethods, on, onInit, onDestroy, getProps }) => {\n setEvents(EVENTS);\n setMethods([\"add\"]);\n const children: Array<HTMLElement | Ref<HTMLElement> | string> = [];\n const reactiveImReady = reactive({\n preReadyCount: 0,\n readyCount: 0,\n errorCount: 0,\n totalErrorCount: 0,\n totalCount: 0,\n isPreReady: false,\n isReady: false,\n hasError: false,\n isPreReadyOver: false,\n add(element: HTMLElement | Ref<HTMLElement> | string) {\n children.push(element);\n },\n });\n const props = getProps() || {};\n const imReady = new ImReady(props);\n\n imReady\n .on(\"error\", (e) => {\n reactiveImReady.hasError = true;\n reactiveImReady.errorCount = e.errorCount;\n reactiveImReady.totalErrorCount = e.totalErrorCount;\n })\n .on(\"preReadyElement\", (e) => {\n reactiveImReady.preReadyCount = e.preReadyCount;\n })\n .on(\"readyElement\", (e) => {\n reactiveImReady.readyCount = e.readyCount;\n reactiveImReady.isPreReadyOver = e.isPreReadyOver;\n })\n .on(\"preReady\", () => {\n reactiveImReady.isPreReady = true;\n })\n .on(\"ready\", () => {\n reactiveImReady.isReady = true;\n });\n\n on((_, name, callback) => {\n imReady.on(name, callback);\n\n return () => {\n imReady.off(name, callback);\n };\n });\n onInit(() => {\n const selector = props?.selector;\n let checkedElements: HTMLElement[] = [];\n\n children.forEach((child) => {\n if (!child) {\n return;\n }\n if (isString(child)) {\n checkedElements = [\n ...checkedElements,\n ...toArray(document.querySelectorAll<HTMLElement>(child)),\n ];\n } else if (child instanceof Element) {\n checkedElements.push(child);\n } else if (\"value\" in child || \"current\" in child) {\n const element = child.value || child.current;\n\n if (element) {\n checkedElements.push(element);\n }\n }\n });\n\n if (selector) {\n checkedElements = checkedElements.reduce((prev, cur) => {\n return [\n ...prev,\n ...[].slice.call(cur.querySelectorAll<HTMLElement>(selector)),\n ];\n }, [] as HTMLElement[]);\n }\n\n reactiveImReady.totalCount = checkedElements.length;\n imReady.check(checkedElements);\n });\n onDestroy(() => {\n imReady.destroy();\n });\n\n return reactiveImReady;\n};\n","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport ImReady, * as modules from \"./index\";\n\nfor (const name in modules) {\n (ImReady as any)[name] = (modules as any)[name];\n}\n\nexport default ImReady;\n"],"names":["isWindow","window","ua","navigator","userAgent","SUPPORT_COMPUTEDSTYLE","IS_IE","test","SUPPORT_ADDEVENTLISTENER","document","WIDTH","HEIGHT","EVENTS","getAttribute","el","name","toArray","arr","slice","call","hasLoadingAttribute","target","prefix","addEvent","element","type","handler","addEventListener","attachEvent","removeEvent","removeEventListener","detachEvent","getSize","size","parseFloat","getComputedStyle","currentStyle","toLowerCase","elements","addAutoSizer","length","resizeAllAutoSizers","__PREFIX__","push","resize","elementPrefix","dataWidth","parseInt","dataHeight","style","forEach","options","_super","_this","e","clear","onError","hasLoading","checkElement","withPreReady","hasDataSize","onReady","isSkip","__extends","__proto","this","onAlreadyReady","onAlreadyPreReady","constructor","onCheck","removeAutoSizer","off","index","indexOf","fixed","splice","trigger","isPreReady","isReady","setTimeout","onPreReady","Loader","Component","ElementLoader","loaders","elementInfos","map","loader","getLoader","check","on","info","checkPreReady","onPreReadyElement","_a","checkReady","onReadyElement","hasError","totalCount","every","totalErrorCount","isPreReadyOver","preReadyCount","readyCount","destroy","children","childrenImReady","tagName","tags","Object","keys","querySelectorAll","join","setHasLoading","some","clone","skipElements","__spreadArrays","tag","contentElements","filter","ImReadyManager","ComponentEvent","errorCount","getErrorCount","src","complete","naturalWidth","onAlreadyError","addEvents","setAttribute","ImageLoader","readyState","error","VideoLoader","img","video","setEvents","setMethods","onInit","onDestroy","getProps","reactiveImReady","add","props","imReady","ImReady","_","callback","selector","checkedElements","child","Element","value","current","reduce","prev","cur","modules"],"mappings":"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"}