diff options
Diffstat (limited to 'src/shared/observe-dom.ts')
| -rw-r--r-- | src/shared/observe-dom.ts | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/shared/observe-dom.ts b/src/shared/observe-dom.ts index e82ce1e..ee6a51f 100644 --- a/src/shared/observe-dom.ts +++ b/src/shared/observe-dom.ts @@ -1,17 +1,20 @@ type ObserveDOMCallback = () => boolean; -let callbacks: (ObserveDOMCallback | null)[] = []; -let callbacksCalledCount = 0; +const callbacks: ObserveDOMCallback[] = []; +/** + * Starts a MutationObserver on the document that invokes each + * registered callback. A callback should return `true` when it + * has completed its work; once all callbacks are done the observer + * disconnects. + */ const observer = new MutationObserver(() => { for (let i = 0; i < callbacks.length; i++) { const callback = callbacks[i]; - if (callback && callback()) { - callbacksCalledCount++; - callbacks[i] = null; - } + if (callback()) + callbacks.splice(i, 1); - if (callbacksCalledCount >= callbacks.length) { + if (callbacks.length <= 0) { observer.disconnect(); break; @@ -24,6 +27,14 @@ observer.observe(document, { subtree: true }); -export function observeDOM(callback: ObserveDOMCallback) { +/** + * Registers a callback to run on DOM mutations. + * The callback is invoked on each mutation tick and should return `true` + * when its work is finished. When all callbacks have completed the + * observer stops. + * + * @param callback - Function that returns `true` when done. + */ +export function observeDOM(callback: ObserveDOMCallback): void { callbacks.push(callback); }; |
