iportal
Version:
web-portal
37 lines (35 loc) • 1.3 kB
text/typescript
const getTimerHandler = (handler: TimerHandler, moduleWindow: Window, stretch?: boolean) => {
return (..._args: any[]) => {
const run = () => {
if (typeof handler === 'function') {
handler(..._args)
} else if (typeof handler === 'string') {
const evalHander = new moduleWindow['Function'](`return ${handler}`)
evalHander(..._args)
}
}
if (moduleWindow['moduleVisibilityState'] === 'visible') {
run()
} else if (stretch) {
moduleWindow.addEventListener('module-visible', () => {
run()
})
}
}
}
export const smartSetTimeout = (moduleWindow: Window) => {
const realSetTimeout = moduleWindow.setTimeout
moduleWindow.setTimeout = (handler: TimerHandler, timeout?: number | undefined, ...args: any[]) => {
const fn = getTimerHandler(handler, moduleWindow, true)
const intervalId = realSetTimeout(fn, timeout, ...args)
return intervalId
}
}
export const smartSetInterval = (moduleWindow: Window) => {
const realSetInterval = moduleWindow.setInterval
moduleWindow.setInterval = (handler: TimerHandler, timeout?: number | undefined, ...args: any[]) => {
const fn = getTimerHandler(handler, moduleWindow)
const intervalId = realSetInterval(fn, timeout, ...args)
return intervalId
}
}