blob: f5110205e94d2407f0db353cbbc10f710299b9c8 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import {$} from 'select-dom';
import onElementRemoval from './on-element-removal.js';
/**
Tracks the replacement of an element, identified via selector.
@param selector The unique selector used to find the element and its future replacements
@param callback The function to call after it's replaced
*/
export default async function onElementReplacement(
selector: string,
callback: (element: HTMLElement) => void,
{runCallbackOnStart = false, signal}: {runCallbackOnStart?: boolean; signal?: AbortSignal} = {},
): Promise<void> {
if (signal?.aborted) {
return;
}
let trackedElement = $(selector);
if (!trackedElement) {
throw new Error('The element can’t be found');
}
if (runCallbackOnStart) {
callback(trackedElement);
}
while (trackedElement) {
// eslint-disable-next-line no-await-in-loop
await onElementRemoval(trackedElement, signal);
if (signal?.aborted) {
return;
}
trackedElement = $(selector);
if (trackedElement) {
callback(trackedElement);
}
}
}
|