UNPKG

50.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"imready.cjs.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/index.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","/*\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): target is HTMLImageElement {\n return (\"loading\" in target) && (target as HTMLImageElement).getAttribute(\"loading\") === \"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);\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 // 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 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.isReady && 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 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)));\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 * @param {HTMLElement} [e.element] - The element with error images.<ko>오류난 이미지가 있는 엘리먼트</ko>\n * @param {number} [e.index] - The item's index with error images. <ko>오류난 이미지가 있는 엘리먼트의 인덱스</ko>\n * @param {HTMLElement} [e.target] - Error image target in element <ko>엘리먼트의 오류난 이미지 타겟</ko>\n * @param {number} [e.errorCount] - The number of elements with errors <ko>에러가 있는 엘리먼트들의 개수</ko>\n * @param {number} [e.totalErrorCount] - The total number of targets with errors <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(\"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 * @param {HTMLElement} [e.element] - The pre-ready element.<ko>사전 준비된 엘리먼트</ko>\n * @param {number} [e.index] - The index of the pre-ready element. <ko>사전 준비된 엘리먼트의 인덱스</ko>\n * @param {number} [e.preReadyCount] - Number of elements pre-ready <ko>사전 준비된 엘리먼트들의 개수</ko>\n * @param {number} [e.readyCount] - Number of elements ready <ko>준비된 엘리먼트들의 개수</ko>\n * @param {number} [e.totalCount] - Total number of elements <ko>엘리먼트들의 총 개수</ko>\n * @param {boolean} [e.isPreReady] - Whether all elements are pre-ready <ko>모든 엘리먼트가 사전 준비가 끝났는지 여부</ko>\n * @param {boolean} [e.isReady] - Whether all elements are ready <ko>모든 엘리먼트가 준비가 끝났는지 여부</ko>\n * @param {boolean} [e.hasLoading] - Whether the loading attribute has been applied <ko>loading 속성이 적용되었는지 여부</ko>\n * @param {boolean} [e.isSkip] - Whether the check is omitted due to skip attribute <ko>skip 속성으로 인하여 체크가 생략됐는지 여부</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(\"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 * @param {number} [e.readyCount] - Number of elements ready <ko>준비된 엘리먼트들의 개수</ko>\n * @param {number} [e.totalCount] - Total number of elements <ko>엘리먼트들의 총 개수</ko>\n * @param {boolean} [e.isReady] - Whether all elements are ready <ko>모든 엘리먼트가 준비가 끝났는지 여부</ko>\n * @param {boolean} [e.hasLoading] - Whether the loading attribute has been applied <ko>loading 속성이 적용되었는지 여부</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(\"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 * @param {HTMLElement} [e.element] - The ready element.<ko>준비된 엘리먼트</ko>\n * @param {number} [e.index] - The index of the ready element. <ko>준비된 엘리먼트의 인덱스</ko>\n * @param {boolean} [e.hasError] - Whether there is an error in the element <ko>해당 엘리먼트에 에러가 있는지 여부</ko>\n * @param {number} [e.errorCount] - The number of elements with errors <ko>에러가 있는 엘리먼트들의 개수</ko>\n * @param {number} [e.totalErrorCount] - The total number of targets with errors <ko>에러가 있는 타겟들의 총 개수</ko>\n * @param {number} [e.preReadyCount] - Number of elements pre-ready <ko>사전 준비된 엘리먼트들의 개수</ko>\n * @param {number} [e.readyCount] - Number of elements ready <ko>준비된 엘리먼트들의 개수</ko>\n * @param {number} [e.totalCount] - Total number of elements <ko>엘리먼트들의 총 개수</ko>\n * @param {boolean} [e.isPreReady] - Whether all elements are pre-ready <ko>모든 엘리먼트가 사전 준비가 끝났는지 여부</ko>\n * @param {boolean} [e.isReady] - Whether all elements are ready <ko>모든 엘리먼트가 준비가 끝났는지 여부</ko>\n * @param {boolean} [e.hasLoading] - Whether the loading attribute has been applied <ko>loading 속성이 적용되었는지 여부</ko>\n * @param {boolean} [e.isPreReadyOver] - Whether pre-ready is over <ko>사전 준비가 끝났는지 여부</ko>\n * @param {boolean} [e.isSkip] - Whether the check is omitted due to skip attribute <ko>skip 속성으로 인하여 체크가 생략됐는지 여부</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(\"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 * @param {number} [e.errorCount] - The number of elements with errors <ko>에러가 있는 엘리먼트들의 개수</ko>\n * @param {number} [e.totalErrorCount] - The total number of targets with errors <ko>에러가 있는 타겟들의 총 개수</ko>\n * @param {number} [e.totalCount] - Total number of elements <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(\"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","/*\negjs-imready\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n*/\nimport ImReady from \"./ImReady\";\nimport Manager from \"./ImReadyManager\";\nimport Loader from \"./loaders/Loader\";\nimport ImageLoader from \"./loaders/ImageLoader\";\nimport VideoLoader from \"./loaders/VideoLoader\";\n\nexport default ImReady;\nexport {\n Manager,\n VideoLoader,\n ImageLoader,\n Loader,\n};\nexport * from \"./types\";\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","getAttribute","el","name","toArray","arr","slice","call","hasSizeAttribute","target","prefix","hasLoadingAttribute","hasSkipAttribute","addEvent","element","type","handler","addEventListener","attachEvent","removeEvent","removeEventListener","detachEvent","innerWidth","getSize","innerHeight","getStyles","getComputedStyle","currentStyle","size","parseFloat","toLowerCase","getContentElements","tags","skipElements","querySelectorAll","__spreadArrays","map","tag","join","filter","indexOf","elements","addAutoSizer","length","resizeAllAutoSizers","__PREFIX__","push","resize","removeAutoSizer","index","fixed","style","splice","elementPrefix","dataWidth","parseInt","dataHeight","forEach","__extends","options","_super","_this","e","clear","onError","withPreReady","hasDataSize","hasLoading","onReady","isSkip","checkElement","onAlreadyReady","onAlreadyPreReady","constructor","EVENTS","onCheck","off","trigger","isPreReady","isReady","setTimeout","onPreReady","Loader","Component","ElementLoader","loaders","elementInfos","loader","getLoader","check","on","info","checkPreReady","onPreReadyElement","_a","checkReady","onReadyElement","hasError","totalCount","every","totalErrorCount","isPreReadyOver","preReadyCount","readyCount","destroy","tagName","Object","keys","children","setHasLoading","some","childrenImReady","clone","contentElements","ImReadyManager","errorCount","getErrorCount","src","complete","naturalWidth","onAlreadyError","addEvents","setAttribute","ImageLoader","readyState","error","VideoLoader","img","video","modules","ImReady"],"mappings":"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"}
\No newline at end of file