import { childList } from './observer' /** * ``载入后运行 * @param callback 回调函数 */ export const headLoaded = (callback: () => T) => new Promise(resolve => { if (document.head !== null) { resolve(callback()) } else { const [observer] = childList(document.documentElement, () => { if (document.head !== null) { observer.disconnect() resolve(callback()) } }) } }) /** * ``载入后运行 (`DOMContentLoaded`) * @param callback 回调函数 */ export const contentLoaded = (callback: () => T) => new Promise(resolve => { if (document.readyState !== 'loading') { resolve(callback()) } else { document.addEventListener('DOMContentLoaded', () => resolve(callback())) } }) /** * 网页`load`事件时运行 * @param callback 回调函数 */ export const fullyLoaded = (callback: () => T) => new Promise(resolve => { if (document.readyState === 'complete') { resolve(callback()) } else { unsafeWindow.addEventListener('load', () => resolve(callback())) } }) /** * 脚本的生命周期事件类型 */ export enum LifeCycleEventTypes { /** 脚本开始运行 */ Start = 'be:start', /** 载入了组件的样式 */ StyleLoaded = 'be:style-loaded', /** 运行了组件的逻辑 */ ComponentsLoaded = 'be:components-loaded', /** 脚本完成运行 */ End = 'be:end', } /** * 触发脚本的生命周期事件 * @param type 事件类型 */ export const raiseLifeCycleEvent = (type: LifeCycleEventTypes) => { unsafeWindow.dispatchEvent(new CustomEvent(type)) }