move resize observer
This commit is contained in:
parent
a624db6fe3
commit
61883bc805
|
|
@ -32,6 +32,7 @@
|
||||||
<li><a href="spreadsheet.html">Spreadsheet</a></li>
|
<li><a href="spreadsheet.html">Spreadsheet</a></li>
|
||||||
<li><a href="spreadsheet-graph.html">Spreadsheet Graph</a></li>
|
<li><a href="spreadsheet-graph.html">Spreadsheet Graph</a></li>
|
||||||
<li><a href="spreadsheet-propagator.html">Spreadsheet Propagator</a></li>
|
<li><a href="spreadsheet-propagator.html">Spreadsheet Propagator</a></li>
|
||||||
|
<li><a href="wiggly.html">Wiggly</a></li>
|
||||||
<!-- <li><a href="chains-of-thought/index.html">Chains of thought</a></li> -->
|
<!-- <li><a href="chains-of-thought/index.html">Chains of thought</a></li> -->
|
||||||
</ul>
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -1,45 +1,4 @@
|
||||||
export type ResizeObserverEntryCallback = (entry: ResizeObserverEntry) => void;
|
import { ResizeObserverManager } from '../resize-observer';
|
||||||
|
|
||||||
class ResizeObserverManager {
|
|
||||||
#elementMap = new WeakMap<Element, Set<ResizeObserverEntryCallback>>();
|
|
||||||
#elementEntry = new WeakMap<Element, ResizeObserverEntry>();
|
|
||||||
|
|
||||||
#vo = new ResizeObserver((entries) => {
|
|
||||||
for (const entry of entries) {
|
|
||||||
this.#elementEntry.set(entry.target, entry);
|
|
||||||
this.#elementMap.get(entry.target)?.forEach((callback) => callback(entry));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
observe(target: Element, callback: ResizeObserverEntryCallback): void {
|
|
||||||
let callbacks = this.#elementMap.get(target);
|
|
||||||
|
|
||||||
if (callbacks === undefined) {
|
|
||||||
this.#vo.observe(target);
|
|
||||||
this.#elementMap.set(target, (callbacks = new Set()));
|
|
||||||
} else {
|
|
||||||
const entry = this.#elementEntry.get(target);
|
|
||||||
if (entry) {
|
|
||||||
callback(entry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
callbacks.add(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
unobserve(target: Element, callback: ResizeObserverEntryCallback): void {
|
|
||||||
const callbacks = this.#elementMap.get(target);
|
|
||||||
|
|
||||||
if (callbacks === undefined) return;
|
|
||||||
|
|
||||||
callbacks.delete(callback);
|
|
||||||
|
|
||||||
if (callbacks.size === 0) {
|
|
||||||
this.#vo.unobserve(target);
|
|
||||||
this.#elementMap.delete(target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const resizeObserver = new ResizeObserverManager();
|
const resizeObserver = new ResizeObserverManager();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
export type ResizeObserverEntryCallback = (entry: ResizeObserverEntry) => void;
|
||||||
|
|
||||||
|
export class ResizeObserverManager {
|
||||||
|
#elementMap = new WeakMap<Element, Set<ResizeObserverEntryCallback>>();
|
||||||
|
#elementEntry = new WeakMap<Element, ResizeObserverEntry>();
|
||||||
|
|
||||||
|
#vo = new ResizeObserver((entries) => {
|
||||||
|
for (const entry of entries) {
|
||||||
|
this.#elementEntry.set(entry.target, entry);
|
||||||
|
this.#elementMap.get(entry.target)?.forEach((callback) => callback(entry));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
observe(target: Element, callback: ResizeObserverEntryCallback): void {
|
||||||
|
let callbacks = this.#elementMap.get(target);
|
||||||
|
|
||||||
|
if (callbacks === undefined) {
|
||||||
|
this.#vo.observe(target);
|
||||||
|
this.#elementMap.set(target, (callbacks = new Set()));
|
||||||
|
} else {
|
||||||
|
const entry = this.#elementEntry.get(target);
|
||||||
|
if (entry) {
|
||||||
|
callback(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callbacks.add(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
unobserve(target: Element, callback: ResizeObserverEntryCallback): void {
|
||||||
|
const callbacks = this.#elementMap.get(target);
|
||||||
|
|
||||||
|
if (callbacks === undefined) return;
|
||||||
|
|
||||||
|
callbacks.delete(callback);
|
||||||
|
|
||||||
|
if (callbacks.size === 0) {
|
||||||
|
this.#vo.unobserve(target);
|
||||||
|
this.#elementMap.delete(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue